Patch to Build Dynamic-Lib (DLL) version of perl using gnuwin32 b17.1
[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
91 char symbolname_buf[MAXPATHLEN];
92 symbolname = dl_add_underscore(symbolname, symbolname_buf);
93#endif
760ac839 94 DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "dl_find_symbol(handle=%x, symbol=%s)\n",
a0d0e21e 95 libhandle, symbolname));
8e07c86e 96 ST(0) = sv_newmortal() ;
97 errno = 0;
98
a0d0e21e 99 status = shl_findsym(&obj, symbolname, TYPE_PROCEDURE, &symaddr);
760ac839 100 DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), " symbolref(PROCEDURE) = %x\n", symaddr));
8e07c86e 101
102 if (status == -1 && errno == 0) { /* try TYPE_DATA instead */
103 status = shl_findsym(&obj, symbolname, TYPE_DATA, &symaddr);
760ac839 104 DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), " symbolref(DATA) = %x\n", symaddr));
8e07c86e 105 }
106
75f92628 107 if (status == -1) {
8e07c86e 108 SaveError("%s",(errno) ? Strerror(errno) : "Symbol not found") ;
75f92628 109 } else {
a0d0e21e 110 sv_setiv( ST(0), (IV)symaddr);
75f92628 111 }
a0d0e21e 112
113
8e07c86e 114void
a0d0e21e 115dl_undef_symbols()
116 PPCODE:
117
118
119
120# These functions should not need changing on any platform:
121
122void
123dl_install_xsub(perl_name, symref, filename="$Package")
124 char * perl_name
125 void * symref
126 char * filename
127 CODE:
760ac839 128 DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "dl_install_xsub(name=%s, symref=%x)\n",
a0d0e21e 129 perl_name, symref));
130 ST(0)=sv_2mortal(newRV((SV*)newXS(perl_name, (void(*)())symref, filename)));
131
132
133char *
134dl_error()
135 CODE:
136 RETVAL = LastError ;
137 OUTPUT:
138 RETVAL
139
140# end.