HP patches didn't make it into _08
[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 *
41dl_load_file(filename)
42 char * filename
43 CODE:
44 shl_t obj = NULL;
8e07c86e 45 int i, max, bind_type;
46
47 if (dl_nonlazy)
48 bind_type = BIND_IMMEDIATE;
49 else
50 bind_type = BIND_DEFERRED;
d43d69ec 51#ifdef DEBUGGING
52 if (dl_debug)
53 bind_type |= BIND_VERBOSE;
54#endif /* DEBUGGING */
8e07c86e 55
56 max = AvFILL(dl_resolve_using);
57 for (i = 0; i <= max; i++) {
58 char *sym = SvPVX(*av_fetch(dl_resolve_using, i, 0));
760ac839 59 DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "dl_load_file(%s) (dependent)\n", sym));
8e07c86e 60 obj = shl_load(sym, bind_type | BIND_NOSTART, 0L);
61 if (obj == NULL) {
62 goto end;
75f92628 63 }
64 }
65
760ac839 66 DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "dl_load_file(%s): ", filename));
8e07c86e 67 obj = shl_load(filename, bind_type | BIND_NOSTART, 0L);
75f92628 68
760ac839 69 DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), " libref=%x\n", obj));
75f92628 70end:
a0d0e21e 71 ST(0) = sv_newmortal() ;
72 if (obj == NULL)
75f92628 73 SaveError("%s",Strerror(errno));
a0d0e21e 74 else
75 sv_setiv( ST(0), (IV)obj);
76
77
78void *
79dl_find_symbol(libhandle, symbolname)
80 void * libhandle
81 char * symbolname
82 CODE:
83 shl_t obj = (shl_t) libhandle;
84 void *symaddr = NULL;
85 int status;
86#ifdef __hp9000s300
87 char symbolname_buf[MAXPATHLEN];
88 symbolname = dl_add_underscore(symbolname, symbolname_buf);
89#endif
760ac839 90 DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "dl_find_symbol(handle=%x, symbol=%s)\n",
a0d0e21e 91 libhandle, symbolname));
8e07c86e 92 ST(0) = sv_newmortal() ;
93 errno = 0;
94
a0d0e21e 95 status = shl_findsym(&obj, symbolname, TYPE_PROCEDURE, &symaddr);
760ac839 96 DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), " symbolref(PROCEDURE) = %x\n", symaddr));
8e07c86e 97
98 if (status == -1 && errno == 0) { /* try TYPE_DATA instead */
99 status = shl_findsym(&obj, symbolname, TYPE_DATA, &symaddr);
760ac839 100 DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), " symbolref(DATA) = %x\n", symaddr));
8e07c86e 101 }
102
75f92628 103 if (status == -1) {
8e07c86e 104 SaveError("%s",(errno) ? Strerror(errno) : "Symbol not found") ;
75f92628 105 } else {
a0d0e21e 106 sv_setiv( ST(0), (IV)symaddr);
75f92628 107 }
a0d0e21e 108
109
8e07c86e 110void
a0d0e21e 111dl_undef_symbols()
112 PPCODE:
113
114
115
116# These functions should not need changing on any platform:
117
118void
119dl_install_xsub(perl_name, symref, filename="$Package")
120 char * perl_name
121 void * symref
122 char * filename
123 CODE:
760ac839 124 DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "dl_install_xsub(name=%s, symref=%x)\n",
a0d0e21e 125 perl_name, symref));
126 ST(0)=sv_2mortal(newRV((SV*)newXS(perl_name, (void(*)())symref, filename)));
127
128
129char *
130dl_error()
131 CODE:
132 RETVAL = LastError ;
133 OUTPUT:
134 RETVAL
135
136# end.