summaryrefslogtreecommitdiffstats
path: root/Python/importdl.c
diff options
context:
space:
mode:
Diffstat (limited to 'Python/importdl.c')
-rw-r--r--Python/importdl.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/Python/importdl.c b/Python/importdl.c
index 7f35d13..b11e1e3 100644
--- a/Python/importdl.c
+++ b/Python/importdl.c
@@ -47,6 +47,7 @@ PERFORMANCE OF THIS SOFTWARE.
_AIX -- AIX style dynamic linking
MS_WIN32 -- Windows NT style dynamic linking (using DLLs)
MS_WIN16 -- Windows 16-bit dynamic linking (using DLLs)
+ PYOS_OS2 -- IBM OS/2 dynamic linking (using DLLs)
_DL_FUNCPTR_DEFINED -- if the typedef dl_funcptr has been defined
USE_MAC_DYNAMIC_LOADING -- Mac CFM shared libraries
SHORT_EXT -- short extension for dynamic module, e.g. ".so"
@@ -76,6 +77,17 @@ typedef void (*dl_funcptr)();
#define LONG_EXT "module.sl"
#endif
+#if defined(PYOS_OS2)
+#define DYNAMIC_LINK
+#define INCL_DOSERRORS
+#define INCL_DOSMODULEMGR
+#include <os2.h>
+typedef int (* APIENTRY dl_funcptr)();
+#define _DL_FUNCPTR_DEFINED 1
+#define SHORT_EXT ".pyd"
+#define LONG_EXT ".dll"
+#endif
+
#if defined(__NetBSD__)
#define DYNAMIC_LINK
#define USE_SHLIB
@@ -458,6 +470,32 @@ _PyImport_LoadDynamicModule(name, pathname, fp)
p = GetProcAddress(hDLL, funcname);
}
#endif /* MS_WIN16 */
+
+#if defined(PYOS_OS2)
+ {
+ APIRET rc;
+ HMODULE hDLL;
+ char failreason[256];
+
+ rc = DosLoadModule(failreason,
+ sizeof(failreason),
+ pathname,
+ &hDLL);
+
+ if (rc != NO_ERROR) {
+ char errBuf[256];
+ sprintf(errBuf,
+ "DLL load failed, rc = %d, problem '%s': %s", rc, failreason);
+ PyErr_SetString(PyExc_ImportError, errBuf);
+ return NULL;
+ }
+
+ rc = DosQueryProcAddr(hDLL, 0L, funcname, &p);
+ if (rc != NO_ERROR)
+ p = NULL; /* Signify Failure to Acquire Entrypoint */
+ }
+#endif /* PYOS_OS2 */
+
#ifdef USE_DL
p = dl_loadmod(Py_GetProgramName(), pathname, funcname);
#endif /* USE_DL */