blob: 7a0de085a5cdb36efdab4898e9fb311d19a93760 [file] [log] [blame]
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossum1ae940a1995-01-02 19:04:15 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossum1ae940a1995-01-02 19:04:15 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossum1ae940a1995-01-02 19:04:15 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossum1ae940a1995-01-02 19:04:15 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossum1ae940a1995-01-02 19:04:15 +000029
30******************************************************************/
31
32/* Support for dynamic loading of extension modules */
33/* If no dynamic linking is supported, this file still generates some code! */
34
Guido van Rossum79f25d91997-04-29 20:08:16 +000035#include "Python.h"
Guido van Rossumcecadc41998-04-10 23:45:14 +000036
37#ifdef HAVE_SYS_PARAM_H
38/* osdefs.h will define MAXPATHLEN if it's not already defined. */
39#include <sys/param.h>
40#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +000041#include "osdefs.h"
42#include "importdl.h"
43
Guido van Rossum1ae940a1995-01-02 19:04:15 +000044/* Explanation of some of the the various #defines used by dynamic linking...
45
46 symbol -- defined for:
47
48 DYNAMIC_LINK -- any kind of dynamic linking
Guido van Rossum75f288d1995-06-14 22:07:26 +000049 USE_RLD -- NeXT dynamic linking
Guido van Rossum1ae940a1995-01-02 19:04:15 +000050 USE_DL -- Jack's dl for IRIX 4 or GNU dld with emulation for Jack's dl
51 USE_SHLIB -- SunOS or IRIX 5 (SVR4?) shared libraries
52 _AIX -- AIX style dynamic linking
Guido van Rossum9b38a141996-09-11 23:12:24 +000053 MS_WIN32 -- Windows NT style dynamic linking (using DLLs)
54 MS_WIN16 -- Windows 16-bit dynamic linking (using DLLs)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000055 PYOS_OS2 -- IBM OS/2 dynamic linking (using DLLs)
Guido van Rossum1ae940a1995-01-02 19:04:15 +000056 _DL_FUNCPTR_DEFINED -- if the typedef dl_funcptr has been defined
Jack Jansen5d9acb61995-06-14 14:54:25 +000057 USE_MAC_DYNAMIC_LOADING -- Mac CFM shared libraries
Guido van Rossum1ae940a1995-01-02 19:04:15 +000058 SHORT_EXT -- short extension for dynamic module, e.g. ".so"
59 LONG_EXT -- long extension, e.g. "module.so"
60 hpux -- HP-UX Dynamic Linking - defined by the compiler
Guido van Rossum15af20a1998-01-19 22:03:52 +000061 __NetBSD__ -- NetBSD shared libraries
62 (assuming dlerror() was introduced between 1.2 and 1.3)
Guido van Rossum25e85291996-02-25 05:02:29 +000063 __FreeBSD__ -- FreeBSD shared libraries
Guido van Rossum1ae940a1995-01-02 19:04:15 +000064
65 (The other WITH_* symbols are used only once, to set the
66 appropriate symbols.)
67*/
68
69/* Configure dynamic linking */
70
Guido van Rossumff4af061996-01-12 01:17:50 +000071#ifdef __hpux
Guido van Rossum1e612491996-08-19 22:12:10 +000072#ifndef hpux
Guido van Rossumff4af061996-01-12 01:17:50 +000073#define hpux
74#endif
Guido van Rossum1e612491996-08-19 22:12:10 +000075#endif
Guido van Rossumff4af061996-01-12 01:17:50 +000076
Guido van Rossum1ae940a1995-01-02 19:04:15 +000077#ifdef hpux
78#define DYNAMIC_LINK
79#include <errno.h>
80typedef void (*dl_funcptr)();
81#define _DL_FUNCPTR_DEFINED 1
82#define SHORT_EXT ".sl"
83#define LONG_EXT "module.sl"
84#endif
85
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000086#if defined(PYOS_OS2)
87#define DYNAMIC_LINK
88#define INCL_DOSERRORS
89#define INCL_DOSMODULEMGR
90#include <os2.h>
91typedef int (* APIENTRY dl_funcptr)();
92#define _DL_FUNCPTR_DEFINED 1
93#define SHORT_EXT ".pyd"
94#define LONG_EXT ".dll"
95#endif
96
Guido van Rossum15af20a1998-01-19 22:03:52 +000097#if defined(__NetBSD__) && (NetBSD < 199712)
Guido van Rossum46c76a61995-01-20 16:53:54 +000098#define DYNAMIC_LINK
99#define USE_SHLIB
100
101#define dlerror() "error in dynamic linking"
102#endif
103
Guido van Rossum9b38a141996-09-11 23:12:24 +0000104#ifdef MS_WINDOWS /* i.e. MS_WIN32 or MS_WIN16 */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000105#define DYNAMIC_LINK
106#include <windows.h>
107typedef FARPROC dl_funcptr;
108#define _DL_FUNCPTR_DEFINED
Guido van Rossum5fb1da71995-01-07 12:36:02 +0000109#define SHORT_EXT ".pyd"
Guido van Rossume71a9471996-04-09 02:39:15 +0000110#define LONG_EXT ".dll"
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000111#endif
112
Guido van Rossum75f288d1995-06-14 22:07:26 +0000113#ifdef NeXT
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000114#define DYNAMIC_LINK
115#define USE_RLD
Guido van Rossum54dec591997-08-16 14:38:09 +0000116#define SHORT_EXT ".so"
117#define LONG_EXT "module.so"
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000118#endif
119
120#ifdef WITH_SGI_DL
121#define DYNAMIC_LINK
122#define USE_DL
123#endif
124
125#ifdef WITH_DL_DLD
126#define DYNAMIC_LINK
127#define USE_DL
128#endif
129
Jack Jansen5d9acb61995-06-14 14:54:25 +0000130#ifdef USE_MAC_DYNAMIC_LOADING
Jack Jansen4e043731995-02-13 22:42:34 +0000131#define DYNAMIC_LINK
Guido van Rossum6a75d261995-02-18 14:51:15 +0000132#define SHORT_EXT ".slb"
Guido van Rossum1e612491996-08-19 22:12:10 +0000133#ifdef __CFM68K__
134#define LONG_EXT ".CFM68K.slb"
135#else
136#define LONG_EXT ".ppc.slb"
137#endif
Jack Jansen4e043731995-02-13 22:42:34 +0000138#ifndef _DL_FUNCPTR_DEFINED
139typedef void (*dl_funcptr)();
140#endif
141#endif
142
Guido van Rossum504f4a91996-08-20 19:59:07 +0000143#if !defined(DYNAMIC_LINK) && (defined(HAVE_DLOPEN) || defined(M_UNIX))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000144#define DYNAMIC_LINK
145#define USE_SHLIB
146#endif
147
148#ifdef _AIX
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000149#undef USE_SHLIB /* AIX 4.2 and higher have dlfcn.h but we don't want it */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000150#define DYNAMIC_LINK
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000151#define SHORT_EXT ".so"
152#define LONG_EXT "module.so"
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000153#include <sys/ldr.h>
154typedef void (*dl_funcptr)();
155#define _DL_FUNCPTR_DEFINED
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000156static int aix_getoldmodules(void **);
157static int aix_bindnewmodule(void *, void *);
158static void aix_loaderror(char *);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000159#endif
160
161#ifdef DYNAMIC_LINK
162
163#ifdef USE_SHLIB
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000164#include <sys/types.h>
165#include <sys/stat.h>
Guido van Rossum15af20a1998-01-19 22:03:52 +0000166#if defined(__NetBSD__) && (NetBSD < 199712)
Guido van Rossum46c76a61995-01-20 16:53:54 +0000167#include <nlist.h>
168#include <link.h>
169#else
Guido van Rossum504f4a91996-08-20 19:59:07 +0000170#ifdef HAVE_DLFCN_H
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000171#include <dlfcn.h>
Guido van Rossum46c76a61995-01-20 16:53:54 +0000172#endif
Guido van Rossum504f4a91996-08-20 19:59:07 +0000173#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000174#ifndef _DL_FUNCPTR_DEFINED
175typedef void (*dl_funcptr)();
176#endif
177#ifndef RTLD_LAZY
178#define RTLD_LAZY 1
179#endif
Guido van Rossum08052c71997-12-02 20:43:18 +0000180#ifndef RTLD_GLOBAL
181#define RTLD_GLOBAL 0
182#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000183#define SHORT_EXT ".so"
184#define LONG_EXT "module.so"
185#endif /* USE_SHLIB */
186
187#if defined(USE_DL) || defined(hpux)
188#include "dl.h"
189#endif
190
Jack Jansen5d9acb61995-06-14 14:54:25 +0000191#ifdef USE_MAC_DYNAMIC_LOADING
Jack Jansen0a72e8d1995-10-23 13:54:01 +0000192#include <Aliases.h>
Jack Jansen4e043731995-02-13 22:42:34 +0000193#include <CodeFragments.h>
Guido van Rossum79f25d91997-04-29 20:08:16 +0000194#ifdef SYMANTEC__CFM68K__ /* Really an older version of Universal Headers */
Guido van Rossum6a75d261995-02-18 14:51:15 +0000195#define CFragConnectionID ConnectionID
196#define kLoadCFrag 0x01
197#endif
Jack Jansen4e043731995-02-13 22:42:34 +0000198#include <Files.h>
199#include "macdefs.h"
200#include "macglue.h"
201#endif
202
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000203#ifdef USE_RLD
204#include <mach-o/rld.h>
205#define FUNCNAME_PATTERN "_init%.200s"
206#ifndef _DL_FUNCPTR_DEFINED
207typedef void (*dl_funcptr)();
208#endif
209#endif /* USE_RLD */
210
Guido van Rossum79f25d91997-04-29 20:08:16 +0000211extern char *Py_GetProgramName();
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000212
213#ifndef FUNCNAME_PATTERN
Guido van Rossum1f740161998-04-13 15:27:21 +0000214#if defined(__hp9000s300) || defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__BORLANDC__)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000215#define FUNCNAME_PATTERN "_init%.200s"
216#else
217#define FUNCNAME_PATTERN "init%.200s"
218#endif
219#endif
220
221#if !defined(SHORT_EXT) && !defined(LONG_EXT)
222#define SHORT_EXT ".o"
223#define LONG_EXT "module.o"
224#endif /* !SHORT_EXT && !LONG_EXT */
225
226#endif /* DYNAMIC_LINK */
227
Guido van Rossum79f25d91997-04-29 20:08:16 +0000228struct filedescr _PyImport_Filetab[] = {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000229#ifdef SHORT_EXT
230 {SHORT_EXT, "rb", C_EXTENSION},
231#endif /* !SHORT_EXT */
232#ifdef LONG_EXT
233 {LONG_EXT, "rb", C_EXTENSION},
234#endif /* !LONG_EXT */
235 {".py", "r", PY_SOURCE},
236 {".pyc", "rb", PY_COMPILED},
237 {0, 0}
238};
239
Guido van Rossum38234201996-07-31 17:55:19 +0000240#ifdef NO_DYNAMIC_LINK
241#undef DYNAMIC_LINK
242#endif
243
Guido van Rossum79f25d91997-04-29 20:08:16 +0000244PyObject *
245_PyImport_LoadDynamicModule(name, pathname, fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000246 char *name;
247 char *pathname;
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000248 FILE *fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000249{
250#ifndef DYNAMIC_LINK
Guido van Rossum79f25d91997-04-29 20:08:16 +0000251 PyErr_SetString(PyExc_ImportError,
252 "dynamically linked modules not supported");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000253 return NULL;
254#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000255 PyObject *m, *d, *s;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000256 char funcname[258];
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000257 char *lastdot, *shortname, *packagecontext;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000258 dl_funcptr p = NULL;
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000259#ifdef USE_SHLIB
260 static struct {
261 dev_t dev;
262 ino_t ino;
263 void *handle;
264 } handles[128];
265 static int nhandles = 0;
Guido van Rossum0bbf2531996-08-09 20:55:05 +0000266 char pathbuf[260];
267 if (strchr(pathname, '/') == NULL) {
268 /* Prefix bare filename with "./" */
269 sprintf(pathbuf, "./%-.255s", pathname);
270 pathname = pathbuf;
271 }
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000272#endif
Guido van Rossum25ce5661997-08-02 03:10:38 +0000273 if ((m = _PyImport_FindExtension(name, pathname)) != NULL) {
274 Py_INCREF(m);
275 return m;
276 }
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000277 lastdot = strrchr(name, '.');
278 if (lastdot == NULL) {
279 packagecontext = NULL;
280 shortname = name;
281 }
282 else {
283 packagecontext = name;
284 shortname = lastdot+1;
285 }
286 sprintf(funcname, FUNCNAME_PATTERN, shortname);
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000287#ifdef USE_SHLIB
288 if (fp != NULL) {
289 int i;
290 struct stat statb;
291 fstat(fileno(fp), &statb);
292 for (i = 0; i < nhandles; i++) {
293 if (statb.st_dev == handles[i].dev &&
294 statb.st_ino == handles[i].ino) {
295 p = (dl_funcptr) dlsym(handles[i].handle,
296 funcname);
297 goto got_it;
298 }
299 }
300 if (nhandles < 128) {
301 handles[nhandles].dev = statb.st_dev;
302 handles[nhandles].ino = statb.st_ino;
303 }
304 }
305#endif /* USE_SHLIB */
Jack Jansen5d9acb61995-06-14 14:54:25 +0000306#ifdef USE_MAC_DYNAMIC_LOADING
307 /*
Guido van Rossum79f25d91997-04-29 20:08:16 +0000308 ** Dynamic loading of CFM shared libraries on the Mac. The
309 ** code has become more convoluted than it was, because we
310 ** want to be able to put multiple modules in a single
311 ** file. For this reason, we have to determine the fragment
312 ** name, and we cannot use the library entry point but we have
313 ** to locate the correct init routine "by hand".
Jack Jansen5d9acb61995-06-14 14:54:25 +0000314 */
Jack Jansen4e043731995-02-13 22:42:34 +0000315 {
316 FSSpec libspec;
317 CFragConnectionID connID;
Guido van Rossum6a75d261995-02-18 14:51:15 +0000318 Ptr mainAddr;
319 Str255 errMessage;
320 OSErr err;
Jack Jansen5d9acb61995-06-14 14:54:25 +0000321 Boolean isfolder, didsomething;
322 char buf[512];
323 Str63 fragname;
324 Ptr symAddr;
325 CFragSymbolClass class;
Jack Jansen4e043731995-02-13 22:42:34 +0000326
Jack Jansen5d9acb61995-06-14 14:54:25 +0000327 /* First resolve any aliases to find the real file */
Jack Jansen4e043731995-02-13 22:42:34 +0000328 (void)FSMakeFSSpec(0, 0, Pstring(pathname), &libspec);
Jack Jansen5d9acb61995-06-14 14:54:25 +0000329 err = ResolveAliasFile(&libspec, 1, &isfolder, &didsomething);
330 if ( err ) {
Guido van Rossumbc2472d1997-04-30 19:07:54 +0000331 sprintf(buf, "%.255s: %.200s",
332 pathname, PyMac_StrError(err));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000333 PyErr_SetString(PyExc_ImportError, buf);
Jack Jansen5d9acb61995-06-14 14:54:25 +0000334 return NULL;
335 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000336 /* Next, determine the fragment name,
337 by stripping '.slb' and 'module' */
Jack Jansen5d9acb61995-06-14 14:54:25 +0000338 memcpy(fragname+1, libspec.name+1, libspec.name[0]);
339 fragname[0] = libspec.name[0];
Guido van Rossum79f25d91997-04-29 20:08:16 +0000340 if( strncmp((char *)(fragname+1+fragname[0]-4),
341 ".slb", 4) == 0 )
Jack Jansen5d9acb61995-06-14 14:54:25 +0000342 fragname[0] -= 4;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000343 if ( strncmp((char *)(fragname+1+fragname[0]-6),
344 "module", 6) == 0 )
Jack Jansen5d9acb61995-06-14 14:54:25 +0000345 fragname[0] -= 6;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000346 /* Load the fragment
347 (or return the connID if it is already loaded */
Jack Jansen5d9acb61995-06-14 14:54:25 +0000348 err = GetDiskFragment(&libspec, 0, 0, fragname,
Guido van Rossum6a75d261995-02-18 14:51:15 +0000349 kLoadCFrag, &connID, &mainAddr,
350 errMessage);
Jack Jansen4e043731995-02-13 22:42:34 +0000351 if ( err ) {
Guido van Rossumbc2472d1997-04-30 19:07:54 +0000352 sprintf(buf, "%.*s: %.200s",
353 errMessage[0], errMessage+1,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000354 PyMac_StrError(err));
355 PyErr_SetString(PyExc_ImportError, buf);
Jack Jansen4e043731995-02-13 22:42:34 +0000356 return NULL;
357 }
Jack Jansen5d9acb61995-06-14 14:54:25 +0000358 /* Locate the address of the correct init function */
359 err = FindSymbol(connID, Pstring(funcname), &symAddr, &class);
360 if ( err ) {
Guido van Rossumbc2472d1997-04-30 19:07:54 +0000361 sprintf(buf, "%s: %.200s",
362 funcname, PyMac_StrError(err));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000363 PyErr_SetString(PyExc_ImportError, buf);
Jack Jansen5d9acb61995-06-14 14:54:25 +0000364 return NULL;
365 }
366 p = (dl_funcptr)symAddr;
Jack Jansen4e043731995-02-13 22:42:34 +0000367 }
Jack Jansen5d9acb61995-06-14 14:54:25 +0000368#endif /* USE_MAC_DYNAMIC_LOADING */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000369#ifdef USE_SHLIB
370 {
371#ifdef RTLD_NOW
372 /* RTLD_NOW: resolve externals now
373 (i.e. core dump now if some are missing) */
Guido van Rossum08052c71997-12-02 20:43:18 +0000374 void *handle = dlopen(pathname, RTLD_NOW | RTLD_GLOBAL);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000375#else
376 void *handle;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000377 if (Py_VerboseFlag)
Guido van Rossum08052c71997-12-02 20:43:18 +0000378 printf("dlopen(\"%s\", %d);\n", pathname,
379 RTLD_LAZY | RTLD_GLOBAL);
380 handle = dlopen(pathname, RTLD_LAZY | RTLD_GLOBAL);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000381#endif /* RTLD_NOW */
382 if (handle == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000383 PyErr_SetString(PyExc_ImportError, dlerror());
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000384 return NULL;
385 }
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000386 if (fp != NULL && nhandles < 128)
387 handles[nhandles++].handle = handle;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000388 p = (dl_funcptr) dlsym(handle, funcname);
389 }
390#endif /* USE_SHLIB */
391#ifdef _AIX
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000392 /*
393 -- Invoke load() with L_NOAUTODEFER leaving the imported symbols
394 -- of the shared module unresolved. Thus we have to resolve them
395 -- explicitely with loadbind. The new module is loaded, then we
396 -- resolve its symbols using the list of already loaded modules
397 -- (only those that belong to the python executable). Get these
398 -- with loadquery(L_GETINFO).
399 */
400 {
401 static void *staticmodlistptr = NULL;
402
403 if (!staticmodlistptr)
404 if (aix_getoldmodules(&staticmodlistptr) == -1)
405 return NULL;
406 p = (dl_funcptr) load(pathname, L_NOAUTODEFER, 0);
407 if (p == NULL) {
408 aix_loaderror(pathname);
409 return NULL;
410 }
411 if (aix_bindnewmodule((void *)p, staticmodlistptr) == -1) {
412 aix_loaderror(pathname);
413 return NULL;
414 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000415 }
416#endif /* _AIX */
Guido van Rossum9b38a141996-09-11 23:12:24 +0000417#ifdef MS_WIN32
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000418 {
419 HINSTANCE hDLL;
420 hDLL = LoadLibrary(pathname);
421 if (hDLL==NULL){
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000422 char errBuf[256];
423 unsigned int errorCode;
424
425 /* Get an error string from Win32 error code */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000426 char theInfo[256]; /* Pointer to error text
427 from system */
428 int theLength; /* Length of error text */
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000429
430 errorCode = GetLastError();
431
Guido van Rossum79f25d91997-04-29 20:08:16 +0000432 theLength = FormatMessage(
433 FORMAT_MESSAGE_FROM_SYSTEM, /* flags */
434 NULL, /* message source */
435 errorCode, /* the message (error) ID */
436 0, /* default language environment */
437 (LPTSTR) theInfo, /* the buffer */
438 sizeof(theInfo), /* the buffer size */
439 NULL); /* no additional format args. */
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000440
Guido van Rossum79f25d91997-04-29 20:08:16 +0000441 /* Problem: could not get the error message.
442 This should not happen if called correctly. */
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000443 if (theLength == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000444 sprintf(errBuf,
445 "DLL load failed with error code %d",
446 errorCode);
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000447 } else {
448 int len;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000449 /* For some reason a \r\n
450 is appended to the text */
451 if (theLength >= 2 &&
452 theInfo[theLength-2] == '\r' &&
453 theInfo[theLength-1] == '\n') {
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000454 theLength -= 2;
455 theInfo[theLength] = '\0';
456 }
457 strcpy(errBuf, "DLL load failed: ");
458 len = strlen(errBuf);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000459 strncpy(errBuf+len, theInfo,
460 sizeof(errBuf)-len);
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000461 errBuf[sizeof(errBuf)-1] = '\0';
462 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000463 PyErr_SetString(PyExc_ImportError, errBuf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000464 return NULL;
465 }
466 p = GetProcAddress(hDLL, funcname);
467 }
Guido van Rossum9b38a141996-09-11 23:12:24 +0000468#endif /* MS_WIN32 */
469#ifdef MS_WIN16
Guido van Rossumdadc8241996-05-23 22:51:40 +0000470 {
471 HINSTANCE hDLL;
472 hDLL = LoadLibrary(pathname);
473 if (hDLL < HINSTANCE_ERROR){
474 char errBuf[256];
Guido van Rossum79f25d91997-04-29 20:08:16 +0000475 sprintf(errBuf,
476 "DLL load failed with error code %d", hDLL);
477 PyErr_SetString(PyExc_ImportError, errBuf);
Guido van Rossumdadc8241996-05-23 22:51:40 +0000478 return NULL;
479 }
480 p = GetProcAddress(hDLL, funcname);
481 }
Guido van Rossum9b38a141996-09-11 23:12:24 +0000482#endif /* MS_WIN16 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000483
484#if defined(PYOS_OS2)
485 {
486 APIRET rc;
487 HMODULE hDLL;
488 char failreason[256];
489
490 rc = DosLoadModule(failreason,
491 sizeof(failreason),
492 pathname,
493 &hDLL);
494
495 if (rc != NO_ERROR) {
496 char errBuf[256];
497 sprintf(errBuf,
498 "DLL load failed, rc = %d, problem '%s': %s", rc, failreason);
499 PyErr_SetString(PyExc_ImportError, errBuf);
500 return NULL;
501 }
502
503 rc = DosQueryProcAddr(hDLL, 0L, funcname, &p);
504 if (rc != NO_ERROR)
505 p = NULL; /* Signify Failure to Acquire Entrypoint */
506 }
507#endif /* PYOS_OS2 */
508
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000509#ifdef USE_DL
Guido van Rossum79f25d91997-04-29 20:08:16 +0000510 p = dl_loadmod(Py_GetProgramName(), pathname, funcname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000511#endif /* USE_DL */
512#ifdef USE_RLD
513 {
514 NXStream *errorStream;
515 struct mach_header *new_header;
516 const char *filenames[2];
517 long ret;
518 unsigned long ptr;
519
520 errorStream = NXOpenMemory(NULL, 0, NX_WRITEONLY);
521 filenames[0] = pathname;
522 filenames[1] = NULL;
523 ret = rld_load(errorStream, &new_header,
524 filenames, NULL);
525
526 /* extract the error messages for the exception */
527 if(!ret) {
528 char *streamBuf;
529 int len, maxLen;
530
531 NXPutc(errorStream, (char)0);
532
533 NXGetMemoryBuffer(errorStream,
534 &streamBuf, &len, &maxLen);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000535 PyErr_SetString(PyExc_ImportError, streamBuf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000536 }
537
538 if(ret && rld_lookup(errorStream, funcname, &ptr))
539 p = (dl_funcptr) ptr;
540
541 NXCloseMemory(errorStream, NX_FREEBUFFER);
542
543 if(!ret)
544 return NULL;
545 }
546#endif /* USE_RLD */
547#ifdef hpux
548 {
549 shl_t lib;
550 int flags;
551
Guido van Rossum3afb5951996-12-05 23:15:35 +0000552 flags = BIND_FIRST | BIND_DEFERRED;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000553 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000554 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000555 flags = DYNAMIC_PATH | BIND_FIRST | BIND_IMMEDIATE |
556 BIND_NONFATAL | BIND_VERBOSE;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000557 printf("shl_load %s\n",pathname);
558 }
559 lib = shl_load(pathname, flags, 0);
560 if (lib == NULL)
561 {
562 char buf[256];
Guido van Rossum79f25d91997-04-29 20:08:16 +0000563 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000564 perror(pathname);
565 sprintf(buf, "Failed to load %.200s", pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000566 PyErr_SetString(PyExc_ImportError, buf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000567 return NULL;
568 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000569 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000570 printf("shl_findsym %s\n", funcname);
571 shl_findsym(&lib, funcname, TYPE_UNDEFINED, (void *) &p);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000572 if (p == NULL && Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000573 perror(funcname);
574 }
575#endif /* hpux */
Guido van Rossum644a12b1997-04-09 19:24:53 +0000576#ifdef USE_SHLIB
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000577 got_it:
Guido van Rossum644a12b1997-04-09 19:24:53 +0000578#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000579 if (p == NULL) {
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000580 PyErr_Format(PyExc_ImportError,
Guido van Rossum42e8e5d1998-01-19 22:23:08 +0000581 "dynamic module does not define init function (%.200s)",
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000582 funcname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000583 return NULL;
584 }
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000585 _Py_PackageContext = packagecontext;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000586 (*p)();
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000587 _Py_PackageContext = NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000588 if (PyErr_Occurred())
589 return NULL;
590 if (_PyImport_FixupExtension(name, pathname) == NULL)
591 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000592
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000593 m = PyDict_GetItemString(PyImport_GetModuleDict(), name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000594 if (m == NULL) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000595 PyErr_SetString(PyExc_SystemError,
596 "dynamic module not initialized properly");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000597 return NULL;
598 }
Guido van Rossum1e612491996-08-19 22:12:10 +0000599 /* Remember the filename as the __file__ attribute */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000600 d = PyModule_GetDict(m);
601 s = PyString_FromString(pathname);
602 if (s == NULL || PyDict_SetItemString(d, "__file__", s) != 0)
603 PyErr_Clear(); /* Not important enough to report */
604 Py_XDECREF(s);
605 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000606 fprintf(stderr,
607 "import %s # dynamically loaded from %s\n",
608 name, pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000609 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000610 return m;
611#endif /* DYNAMIC_LINK */
612}
613
614
615#ifdef _AIX
616
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000617#include <ctype.h> /* for isdigit() */
618#include <errno.h> /* for global errno */
619#include <string.h> /* for strerror() */
620#include <stdlib.h> /* for malloc(), free() */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000621
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000622typedef struct Module {
623 struct Module *next;
624 void *entry;
625} Module, *ModulePtr;
626
627static int
628aix_getoldmodules(modlistptr)
629 void **modlistptr;
630{
631 register ModulePtr modptr, prevmodptr;
632 register struct ld_info *ldiptr;
633 register char *ldibuf;
634 register int errflag, bufsize = 1024;
635 register unsigned int offset;
636
637 /*
638 -- Get the list of loaded modules into ld_info structures.
639 */
640 if ((ldibuf = malloc(bufsize)) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000641 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000642 return -1;
643 }
644 while ((errflag = loadquery(L_GETINFO, ldibuf, bufsize)) == -1
645 && errno == ENOMEM) {
646 free(ldibuf);
647 bufsize += 1024;
648 if ((ldibuf = malloc(bufsize)) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000649 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000650 return -1;
651 }
652 }
653 if (errflag == -1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000654 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000655 return -1;
656 }
657 /*
658 -- Make the modules list from the ld_info structures.
659 */
660 ldiptr = (struct ld_info *)ldibuf;
661 prevmodptr = NULL;
662 do {
Guido van Rossum3b31cd21997-10-10 17:40:00 +0000663 if (strstr(ldiptr->ldinfo_filename, "python") == NULL) {
664 /*
665 -- Extract only the modules containing "python" as a
666 -- substring, like the "python[version]" executable or
667 -- "libpython[version].a" in case python is embedded.
668 */
669 offset = (unsigned int)ldiptr->ldinfo_next;
670 ldiptr = (struct ld_info *)((unsigned int)
671 ldiptr + offset);
672 continue;
673 }
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000674 if ((modptr = (ModulePtr)malloc(sizeof(Module))) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000675 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000676 while (*modlistptr) {
677 modptr = (ModulePtr)*modlistptr;
678 *modlistptr = (void *)modptr->next;
679 free(modptr);
680 }
681 return -1;
682 }
683 modptr->entry = ldiptr->ldinfo_dataorg;
684 modptr->next = NULL;
685 if (prevmodptr == NULL)
686 *modlistptr = (void *)modptr;
687 else
688 prevmodptr->next = modptr;
689 prevmodptr = modptr;
690 offset = (unsigned int)ldiptr->ldinfo_next;
691 ldiptr = (struct ld_info *)((unsigned int)ldiptr + offset);
692 } while (offset);
693 free(ldibuf);
694 return 0;
695}
696
697static int
698aix_bindnewmodule(newmoduleptr, modlistptr)
699 void *newmoduleptr;
700 void *modlistptr;
701{
702 register ModulePtr modptr;
703
704 /*
705 -- Bind the new module with the list of loaded modules.
706 */
707 for (modptr = (ModulePtr)modlistptr; modptr; modptr = modptr->next)
708 if (loadbind(0, modptr->entry, newmoduleptr) != 0)
709 return -1;
710 return 0;
711}
712
713static void
714aix_loaderror(pathname)
715 char *pathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000716{
717
Guido van Rossum236f62d1996-06-26 21:07:08 +0000718 char *message[1024], errbuf[1024];
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000719 register int i,j;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000720
721 struct errtab {
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000722 int errNo;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000723 char *errstr;
724 } load_errtab[] = {
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000725 {L_ERROR_TOOMANY, "too many errors, rest skipped."},
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000726 {L_ERROR_NOLIB, "can't load library:"},
727 {L_ERROR_UNDEF, "can't find symbol in library:"},
728 {L_ERROR_RLDBAD,
729 "RLD index out of range or bad relocation type:"},
730 {L_ERROR_FORMAT, "not a valid, executable xcoff file:"},
731 {L_ERROR_MEMBER,
732 "file not an archive or does not contain requested member:"},
733 {L_ERROR_TYPE, "symbol table mismatch:"},
Guido van Rossum236f62d1996-06-26 21:07:08 +0000734 {L_ERROR_ALIGN, "text alignment in file is wrong."},
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000735 {L_ERROR_SYSTEM, "System error:"},
736 {L_ERROR_ERRNO, NULL}
737 };
738
739#define LOAD_ERRTAB_LEN (sizeof(load_errtab)/sizeof(load_errtab[0]))
740#define ERRBUF_APPEND(s) strncat(errbuf, s, sizeof(errbuf)-strlen(errbuf)-1)
741
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000742 sprintf(errbuf, "from module %.200s ", pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000743
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000744 if (!loadquery(L_GETMESSAGES, &message[0], sizeof(message))) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000745 ERRBUF_APPEND(strerror(errno));
Guido van Rossum236f62d1996-06-26 21:07:08 +0000746 ERRBUF_APPEND("\n");
747 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000748 for(i = 0; message[i] && *message[i]; i++) {
749 int nerr = atoi(message[i]);
750 for (j=0; j<LOAD_ERRTAB_LEN ; j++) {
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000751 if (nerr == load_errtab[j].errNo && load_errtab[j].errstr)
Guido van Rossum236f62d1996-06-26 21:07:08 +0000752 ERRBUF_APPEND(load_errtab[j].errstr);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000753 }
754 while (isdigit(*message[i])) message[i]++ ;
755 ERRBUF_APPEND(message[i]);
756 ERRBUF_APPEND("\n");
757 }
758 errbuf[strlen(errbuf)-1] = '\0'; /* trim off last newline */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000759 PyErr_SetString(PyExc_ImportError, errbuf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000760 return;
761}
762
763#endif /* _AIX */