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;
32 /* Not found. Check for non-FAT name and try truncated name. */
33 /* Don't know if this helps though... */
34 for (beg = dot = path + strlen(path);
35 beg > path && !strchr(":/\\", *(beg-1));
41 memmove(tmp, path, n);
42 memmove(tmp+n, dot, strlen(dot)+1);
43 if (DosLoadModule(fail, sizeof fail, tmp, &handle) == 0)
44 return (void *)handle;
51 dlsym(void *handle, char *symbol)
56 rc = DosQueryProcAddr((HMODULE)handle, 0, symbol, &addr);
58 rc = DosQueryProcType((HMODULE)handle, 0, symbol, &type);
59 if (rc == 0 && type == PT_32BIT)
61 rc = ERROR_CALL_NOT_IMPLEMENTED;
75 if (DosGetMessage(NULL, 0, buf, sizeof buf - 1, retcode, "OSO001.MSG", &len))
76 sprintf(buf, "OS/2 system error code %d", retcode);
87 (void)dl_generic_private_init();
101 if (!SvROK(sv)) croak("Not a reference given to mod2fname");
103 if (SvTYPE(sv) != SVt_PVAV)
104 croak("Not array reference given to mod2fname");
105 if (av_len((AV*)sv) < 0)
106 croak("Empty array reference given to mod2fname");
107 s = SvPV(*av_fetch((AV*)sv, av_len((AV*)sv), FALSE), na);
108 strncpy(fname, s, 8);
109 if ((len=strlen(s)) < 7) pos = len;
111 fname[pos + 1] = '\0';
112 return (char *)fname;
115 MODULE = DynaLoader PACKAGE = DynaLoader
118 (void)dl_private_init();
122 dl_load_file(filename)
125 int mode = 1; /* Solaris 1 */
127 mode = RTLD_LAZY; /* Solaris 2 */
129 DLDEBUG(1,fprintf(stderr,"dl_load_file(%s):\n", filename));
130 RETVAL = dlopen(filename, mode) ;
131 DLDEBUG(2,fprintf(stderr," libref=%x\n", RETVAL));
132 ST(0) = sv_newmortal() ;
134 SaveError("%s",dlerror()) ;
136 sv_setiv( ST(0), (IV)RETVAL);
140 dl_find_symbol(libhandle, symbolname)
144 #ifdef DLSYM_NEEDS_UNDERSCORE
145 char symbolname_buf[1024];
146 symbolname = dl_add_underscore(symbolname, symbolname_buf);
148 DLDEBUG(2,fprintf(stderr,"dl_find_symbol(handle=%x, symbol=%s)\n",
149 libhandle, symbolname));
150 RETVAL = dlsym(libhandle, symbolname);
151 DLDEBUG(2,fprintf(stderr," symbolref = %x\n", RETVAL));
152 ST(0) = sv_newmortal() ;
154 SaveError("%s",dlerror()) ;
156 sv_setiv( ST(0), (IV)RETVAL);
168 # These functions should not need changing on any platform:
171 dl_install_xsub(perl_name, symref, filename="$Package")
176 DLDEBUG(2,fprintf(stderr,"dl_install_xsub(name=%s, symref=%x)\n",
178 ST(0)=sv_2mortal(newRV((SV*)newXS(perl_name, (void(*)())symref, filename)));