0e146830ef3942c8a566ecda8e94127b879b437c
[p5sagit/p5-mst-13.2.git] / ext / DynaLoader / dl_hpux.xs
1 /*
2  * Author: Jeff Okamoto (okamoto@corp.hp.com)
3  * Version: 2.1, 1995/1/25
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
24 static AV *dl_resolve_using = Nullav;
25
26
27 static void
28 dl_private_init()
29 {
30     (void)dl_generic_private_init();
31     dl_resolve_using = perl_get_av("DynaLoader::dl_resolve_using", 0x4);
32 }
33
34 MODULE = DynaLoader     PACKAGE = DynaLoader
35
36 BOOT:
37     (void)dl_private_init();
38
39
40 void *
41 dl_load_file(filename)
42     char *              filename
43     CODE:
44     shl_t obj = NULL;
45     int i, max, bind_type;
46
47     if (dl_nonlazy)
48         bind_type = BIND_IMMEDIATE;
49     else
50         bind_type = BIND_DEFERRED;
51
52     max = AvFILL(dl_resolve_using);
53     for (i = 0; i <= max; i++) {
54         char *sym = SvPVX(*av_fetch(dl_resolve_using, i, 0));
55         DLDEBUG(1,fprintf(stderr, "dl_load_file(%s) (dependent)\n", sym));
56         obj = shl_load(sym, bind_type | BIND_NOSTART, 0L);
57         if (obj == NULL) {
58             goto end;
59         }
60     }
61
62     DLDEBUG(1,fprintf(stderr,"dl_load_file(%s): ", filename));
63     obj = shl_load(filename, bind_type | BIND_NOSTART, 0L);
64
65     DLDEBUG(2,fprintf(stderr," libref=%x\n", obj));
66 end:
67     ST(0) = sv_newmortal() ;
68     if (obj == NULL)
69         SaveError("%s",Strerror(errno));
70     else
71         sv_setiv( ST(0), (IV)obj);
72
73
74 void *
75 dl_find_symbol(libhandle, symbolname)
76     void *      libhandle
77     char *      symbolname
78     CODE:
79     shl_t obj = (shl_t) libhandle;
80     void *symaddr = NULL;
81     int status;
82 #ifdef __hp9000s300
83     char symbolname_buf[MAXPATHLEN];
84     symbolname = dl_add_underscore(symbolname, symbolname_buf);
85 #endif
86     DLDEBUG(2,fprintf(stderr,"dl_find_symbol(handle=%x, symbol=%s)\n",
87                 libhandle, symbolname));
88     ST(0) = sv_newmortal() ;
89     errno = 0;
90
91     status = shl_findsym(&obj, symbolname, TYPE_PROCEDURE, &symaddr);
92     DLDEBUG(2,fprintf(stderr,"  symbolref(PROCEDURE) = %x\n", symaddr));
93
94     if (status == -1 && errno == 0) {   /* try TYPE_DATA instead */
95         status = shl_findsym(&obj, symbolname, TYPE_DATA, &symaddr);
96         DLDEBUG(2,fprintf(stderr,"  symbolref(DATA) = %x\n", symaddr));
97     }
98
99     if (status == -1) {
100         SaveError("%s",(errno) ? Strerror(errno) : "Symbol not found") ;
101     } else {
102         sv_setiv( ST(0), (IV)symaddr);
103     }
104
105
106 void
107 dl_undef_symbols()
108     PPCODE:
109
110
111
112 # These functions should not need changing on any platform:
113
114 void
115 dl_install_xsub(perl_name, symref, filename="$Package")
116     char *      perl_name
117     void *      symref 
118     char *      filename
119     CODE:
120     DLDEBUG(2,fprintf(stderr,"dl_install_xsub(name=%s, symref=%x)\n",
121             perl_name, symref));
122     ST(0)=sv_2mortal(newRV((SV*)newXS(perl_name, (void(*)())symref, filename)));
123
124
125 char *
126 dl_error()
127     CODE:
128     RETVAL = LastError ;
129     OUTPUT:
130     RETVAL
131
132 # end.