[inseparable changes from match from perl-5.003_97g to perl-5.003_97h]
[p5sagit/p5-mst-13.2.git] / ext / DynaLoader / dl_hpux.xs
CommitLineData
a0d0e21e 1/*
2 * Author: Jeff Okamoto (okamoto@corp.hp.com)
75f92628 3 * Version: 2.1, 1995/1/25
a0d0e21e 4 */
5
6#ifdef __hp9000s300
7#define magic hpux_magic
8#define MAGIC HPUX_MAGIC
9#endif
10
11#include <dl.h>
12#ifdef __hp9000s300
13#undef magic
14#undef MAGIC
15#endif
16
17#include "EXTERN.h"
18#include "perl.h"
19#include "XSUB.h"
20
21
22#include "dlutils.c" /* for SaveError() etc */
23
8e07c86e 24static AV *dl_resolve_using = Nullav;
25
a0d0e21e 26
27static void
28dl_private_init()
29{
30 (void)dl_generic_private_init();
8e07c86e 31 dl_resolve_using = perl_get_av("DynaLoader::dl_resolve_using", 0x4);
a0d0e21e 32}
33
34MODULE = DynaLoader PACKAGE = DynaLoader
35
36BOOT:
37 (void)dl_private_init();
38
39
40void *
ff7f3c60 41dl_load_file(filename, flags=0)
42 char * filename
43 int flags
44 PREINIT:
a0d0e21e 45 shl_t obj = NULL;
8e07c86e 46 int i, max, bind_type;
ff7f3c60 47 CODE:
48 DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "dl_load_file(%s,%x):\n", filename,flags));
49 if (flags & 0x01)
50 warn("Can't make loaded symbols global on this platform while loading %s",filename);
8e07c86e 51 if (dl_nonlazy)
52 bind_type = BIND_IMMEDIATE;
53 else
54 bind_type = BIND_DEFERRED;
d43d69ec 55#ifdef DEBUGGING
56 if (dl_debug)
57 bind_type |= BIND_VERBOSE;
58#endif /* DEBUGGING */
8e07c86e 59
60 max = AvFILL(dl_resolve_using);
61 for (i = 0; i <= max; i++) {
62 char *sym = SvPVX(*av_fetch(dl_resolve_using, i, 0));
760ac839 63 DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "dl_load_file(%s) (dependent)\n", sym));
8e07c86e 64 obj = shl_load(sym, bind_type | BIND_NOSTART, 0L);
65 if (obj == NULL) {
66 goto end;
75f92628 67 }
68 }
69
760ac839 70 DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "dl_load_file(%s): ", filename));
8e07c86e 71 obj = shl_load(filename, bind_type | BIND_NOSTART, 0L);
75f92628 72
760ac839 73 DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), " libref=%x\n", obj));
75f92628 74end:
a0d0e21e 75 ST(0) = sv_newmortal() ;
76 if (obj == NULL)
75f92628 77 SaveError("%s",Strerror(errno));
a0d0e21e 78 else
79 sv_setiv( ST(0), (IV)obj);
80
81
82void *
83dl_find_symbol(libhandle, symbolname)
84 void * libhandle
85 char * symbolname
86 CODE:
87 shl_t obj = (shl_t) libhandle;
88 void *symaddr = NULL;
89 int status;
90#ifdef __hp9000s300
46fc3d4c 91 symbolname = form("_%s", symbolname);
a0d0e21e 92#endif
46fc3d4c 93 DLDEBUG(2, PerlIO_printf(PerlIO_stderr(),
94 "dl_find_symbol(handle=%lx, symbol=%s)\n",
95 (unsigned long) libhandle, symbolname));
96
8e07c86e 97 ST(0) = sv_newmortal() ;
98 errno = 0;
99
a0d0e21e 100 status = shl_findsym(&obj, symbolname, TYPE_PROCEDURE, &symaddr);
760ac839 101 DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), " symbolref(PROCEDURE) = %x\n", symaddr));
8e07c86e 102
103 if (status == -1 && errno == 0) { /* try TYPE_DATA instead */
104 status = shl_findsym(&obj, symbolname, TYPE_DATA, &symaddr);
760ac839 105 DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), " symbolref(DATA) = %x\n", symaddr));
8e07c86e 106 }
107
75f92628 108 if (status == -1) {
8e07c86e 109 SaveError("%s",(errno) ? Strerror(errno) : "Symbol not found") ;
75f92628 110 } else {
a0d0e21e 111 sv_setiv( ST(0), (IV)symaddr);
75f92628 112 }
a0d0e21e 113
114
8e07c86e 115void
a0d0e21e 116dl_undef_symbols()
117 PPCODE:
118
119
120
121# These functions should not need changing on any platform:
122
123void
124dl_install_xsub(perl_name, symref, filename="$Package")
125 char * perl_name
126 void * symref
127 char * filename
128 CODE:
760ac839 129 DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "dl_install_xsub(name=%s, symref=%x)\n",
a0d0e21e 130 perl_name, symref));
131 ST(0)=sv_2mortal(newRV((SV*)newXS(perl_name, (void(*)())symref, filename)));
132
133
134char *
135dl_error()
136 CODE:
137 RETVAL = LastError ;
138 OUTPUT:
139 RETVAL
140
141# end.