4 * Author: Andreas Kaiser (ak@ananke.s.bawue.de)
5 * Created: 08th December 1994
15 #include "dlutils.c" /* SaveError() etc */
20 dlopen(char *path, int mode)
23 char tmp[260], *beg, *dot;
27 if ((rc = DosLoadModule(fail, sizeof fail, path, &handle)) == 0)
28 return (void *)handle;
30 /* Not found. Check for non-FAT name and try truncated name. */
31 /* Don't know if this helps though... */
32 for (beg = dot = path + strlen(path);
33 beg > path && !strchr(":/\\", *(beg-1));
39 memmove(tmp, path, n);
40 memmove(tmp+n, dot, strlen(dot)+1);
41 if (DosLoadModule(fail, sizeof fail, tmp, &handle) == 0)
42 return (void *)handle;
50 dlsym(void *handle, char *symbol)
55 rc = DosQueryProcAddr((HMODULE)handle, 0, symbol, &addr);
57 rc = DosQueryProcType((HMODULE)handle, 0, symbol, &type);
58 if (rc == 0 && type == PT_32BIT)
60 rc = ERROR_CALL_NOT_IMPLEMENTED;
74 if (DosGetMessage(NULL, 0, buf, sizeof buf - 1, retcode, "OSO001.MSG", &len))
75 sprintf(buf, "OS/2 system error code %d", retcode);
86 (void)dl_generic_private_init();
100 if (!SvROK(sv)) croak("Not a reference given to mod2fname");
102 if (SvTYPE(sv) != SVt_PVAV)
103 croak("Not array reference given to mod2fname");
104 if (av_len((AV*)sv) < 0)
105 croak("Empty array reference given to mod2fname");
106 s = SvPV(*av_fetch((AV*)sv, av_len((AV*)sv), FALSE), na);
107 strncpy(fname, s, 8);
108 if ((len=strlen(s)) < 7) pos = len;
110 fname[pos + 1] = '\0';
111 return (char *)fname;
114 MODULE = DynaLoader PACKAGE = DynaLoader
117 (void)dl_private_init();
121 dl_load_file(filename)
124 int mode = 1; /* Solaris 1 */
126 mode = RTLD_LAZY; /* Solaris 2 */
128 DLDEBUG(1,fprintf(stderr,"dl_load_file(%s):\n", filename));
129 RETVAL = dlopen(filename, mode) ;
130 DLDEBUG(2,fprintf(stderr," libref=%x\n", RETVAL));
131 ST(0) = sv_newmortal() ;
133 SaveError("%s",dlerror()) ;
135 sv_setiv( ST(0), (IV)RETVAL);
139 dl_find_symbol(libhandle, symbolname)
143 #ifdef DLSYM_NEEDS_UNDERSCORE
144 char symbolname_buf[1024];
145 symbolname = dl_add_underscore(symbolname, symbolname_buf);
147 DLDEBUG(2,fprintf(stderr,"dl_find_symbol(handle=%x, symbol=%s)\n",
148 libhandle, symbolname));
149 RETVAL = dlsym(libhandle, symbolname);
150 DLDEBUG(2,fprintf(stderr," symbolref = %x\n", RETVAL));
151 ST(0) = sv_newmortal() ;
153 SaveError("%s",dlerror()) ;
155 sv_setiv( ST(0), (IV)RETVAL);
167 # These functions should not need changing on any platform:
170 dl_install_xsub(perl_name, symref, filename="$Package")
175 DLDEBUG(2,fprintf(stderr,"dl_install_xsub(name=%s, symref=%x)\n",
177 ST(0)=sv_2mortal(newRV((SV*)newXS(perl_name, (void(*)())symref, filename)));