blob: 93282a3f9659939c235edec1d3e8a73749acd00f [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>
Guido van Rossuma5e1b001998-06-27 21:53:17 +0000107#include <direct.h>
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000108typedef FARPROC dl_funcptr;
109#define _DL_FUNCPTR_DEFINED
Guido van Rossum859b16c1998-05-15 20:22:08 +0000110#ifdef _DEBUG
111#define SHORT_EXT "_d.pyd"
112#define LONG_EXT "_d.dll"
113#else
Guido van Rossum5fb1da71995-01-07 12:36:02 +0000114#define SHORT_EXT ".pyd"
Guido van Rossume71a9471996-04-09 02:39:15 +0000115#define LONG_EXT ".dll"
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000116#endif
Guido van Rossum859b16c1998-05-15 20:22:08 +0000117#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000118
Guido van Rossum75f288d1995-06-14 22:07:26 +0000119#ifdef NeXT
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000120#define DYNAMIC_LINK
121#define USE_RLD
Guido van Rossum54dec591997-08-16 14:38:09 +0000122#define SHORT_EXT ".so"
123#define LONG_EXT "module.so"
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000124#endif
125
126#ifdef WITH_SGI_DL
127#define DYNAMIC_LINK
128#define USE_DL
129#endif
130
131#ifdef WITH_DL_DLD
132#define DYNAMIC_LINK
133#define USE_DL
134#endif
135
Jack Jansen5d9acb61995-06-14 14:54:25 +0000136#ifdef USE_MAC_DYNAMIC_LOADING
Jack Jansen4e043731995-02-13 22:42:34 +0000137#define DYNAMIC_LINK
Guido van Rossum6a75d261995-02-18 14:51:15 +0000138#define SHORT_EXT ".slb"
Guido van Rossum1e612491996-08-19 22:12:10 +0000139#ifdef __CFM68K__
140#define LONG_EXT ".CFM68K.slb"
141#else
142#define LONG_EXT ".ppc.slb"
143#endif
Jack Jansen4e043731995-02-13 22:42:34 +0000144#ifndef _DL_FUNCPTR_DEFINED
145typedef void (*dl_funcptr)();
146#endif
147#endif
148
Guido van Rossum504f4a91996-08-20 19:59:07 +0000149#if !defined(DYNAMIC_LINK) && (defined(HAVE_DLOPEN) || defined(M_UNIX))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000150#define DYNAMIC_LINK
151#define USE_SHLIB
152#endif
153
154#ifdef _AIX
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000155#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 +0000156#define DYNAMIC_LINK
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000157#define SHORT_EXT ".so"
158#define LONG_EXT "module.so"
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000159#include <sys/ldr.h>
160typedef void (*dl_funcptr)();
161#define _DL_FUNCPTR_DEFINED
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000162static int aix_getoldmodules(void **);
163static int aix_bindnewmodule(void *, void *);
164static void aix_loaderror(char *);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000165#endif
166
167#ifdef DYNAMIC_LINK
168
169#ifdef USE_SHLIB
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000170#include <sys/types.h>
171#include <sys/stat.h>
Guido van Rossum15af20a1998-01-19 22:03:52 +0000172#if defined(__NetBSD__) && (NetBSD < 199712)
Guido van Rossum46c76a61995-01-20 16:53:54 +0000173#include <nlist.h>
174#include <link.h>
175#else
Guido van Rossum504f4a91996-08-20 19:59:07 +0000176#ifdef HAVE_DLFCN_H
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000177#include <dlfcn.h>
Guido van Rossum46c76a61995-01-20 16:53:54 +0000178#endif
Guido van Rossum504f4a91996-08-20 19:59:07 +0000179#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000180#ifndef _DL_FUNCPTR_DEFINED
181typedef void (*dl_funcptr)();
182#endif
183#ifndef RTLD_LAZY
184#define RTLD_LAZY 1
185#endif
186#define SHORT_EXT ".so"
187#define LONG_EXT "module.so"
188#endif /* USE_SHLIB */
189
190#if defined(USE_DL) || defined(hpux)
191#include "dl.h"
192#endif
193
Jack Jansen5d9acb61995-06-14 14:54:25 +0000194#ifdef USE_MAC_DYNAMIC_LOADING
Jack Jansen0a72e8d1995-10-23 13:54:01 +0000195#include <Aliases.h>
Jack Jansen4e043731995-02-13 22:42:34 +0000196#include <CodeFragments.h>
Guido van Rossum79f25d91997-04-29 20:08:16 +0000197#ifdef SYMANTEC__CFM68K__ /* Really an older version of Universal Headers */
Guido van Rossum6a75d261995-02-18 14:51:15 +0000198#define CFragConnectionID ConnectionID
199#define kLoadCFrag 0x01
200#endif
Jack Jansen4e043731995-02-13 22:42:34 +0000201#include <Files.h>
202#include "macdefs.h"
203#include "macglue.h"
204#endif
205
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000206#ifdef USE_RLD
207#include <mach-o/rld.h>
208#define FUNCNAME_PATTERN "_init%.200s"
209#ifndef _DL_FUNCPTR_DEFINED
210typedef void (*dl_funcptr)();
211#endif
212#endif /* USE_RLD */
213
Guido van Rossum79f25d91997-04-29 20:08:16 +0000214extern char *Py_GetProgramName();
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000215
216#ifndef FUNCNAME_PATTERN
Guido van Rossum1f740161998-04-13 15:27:21 +0000217#if defined(__hp9000s300) || defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__BORLANDC__)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000218#define FUNCNAME_PATTERN "_init%.200s"
219#else
220#define FUNCNAME_PATTERN "init%.200s"
221#endif
222#endif
223
224#if !defined(SHORT_EXT) && !defined(LONG_EXT)
225#define SHORT_EXT ".o"
226#define LONG_EXT "module.o"
227#endif /* !SHORT_EXT && !LONG_EXT */
228
229#endif /* DYNAMIC_LINK */
230
Guido van Rossum79f25d91997-04-29 20:08:16 +0000231struct filedescr _PyImport_Filetab[] = {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000232#ifdef SHORT_EXT
233 {SHORT_EXT, "rb", C_EXTENSION},
234#endif /* !SHORT_EXT */
235#ifdef LONG_EXT
236 {LONG_EXT, "rb", C_EXTENSION},
237#endif /* !LONG_EXT */
238 {".py", "r", PY_SOURCE},
239 {".pyc", "rb", PY_COMPILED},
240 {0, 0}
241};
242
Guido van Rossum38234201996-07-31 17:55:19 +0000243#ifdef NO_DYNAMIC_LINK
244#undef DYNAMIC_LINK
245#endif
246
Guido van Rossum79f25d91997-04-29 20:08:16 +0000247PyObject *
248_PyImport_LoadDynamicModule(name, pathname, fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000249 char *name;
250 char *pathname;
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000251 FILE *fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000252{
253#ifndef DYNAMIC_LINK
Guido van Rossum79f25d91997-04-29 20:08:16 +0000254 PyErr_SetString(PyExc_ImportError,
255 "dynamically linked modules not supported");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000256 return NULL;
257#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000258 PyObject *m, *d, *s;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000259 char funcname[258];
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000260 char *lastdot, *shortname, *packagecontext;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000261 dl_funcptr p = NULL;
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000262#ifdef USE_SHLIB
263 static struct {
264 dev_t dev;
265 ino_t ino;
266 void *handle;
267 } handles[128];
268 static int nhandles = 0;
Guido van Rossum0bbf2531996-08-09 20:55:05 +0000269 char pathbuf[260];
270 if (strchr(pathname, '/') == NULL) {
271 /* Prefix bare filename with "./" */
272 sprintf(pathbuf, "./%-.255s", pathname);
273 pathname = pathbuf;
274 }
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000275#endif
Guido van Rossum25ce5661997-08-02 03:10:38 +0000276 if ((m = _PyImport_FindExtension(name, pathname)) != NULL) {
277 Py_INCREF(m);
278 return m;
279 }
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000280 lastdot = strrchr(name, '.');
281 if (lastdot == NULL) {
282 packagecontext = NULL;
283 shortname = name;
284 }
285 else {
286 packagecontext = name;
287 shortname = lastdot+1;
288 }
289 sprintf(funcname, FUNCNAME_PATTERN, shortname);
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000290#ifdef USE_SHLIB
291 if (fp != NULL) {
292 int i;
293 struct stat statb;
294 fstat(fileno(fp), &statb);
295 for (i = 0; i < nhandles; i++) {
296 if (statb.st_dev == handles[i].dev &&
297 statb.st_ino == handles[i].ino) {
298 p = (dl_funcptr) dlsym(handles[i].handle,
299 funcname);
300 goto got_it;
301 }
302 }
303 if (nhandles < 128) {
304 handles[nhandles].dev = statb.st_dev;
305 handles[nhandles].ino = statb.st_ino;
306 }
307 }
308#endif /* USE_SHLIB */
Jack Jansen5d9acb61995-06-14 14:54:25 +0000309#ifdef USE_MAC_DYNAMIC_LOADING
310 /*
Guido van Rossum79f25d91997-04-29 20:08:16 +0000311 ** Dynamic loading of CFM shared libraries on the Mac. The
312 ** code has become more convoluted than it was, because we
313 ** want to be able to put multiple modules in a single
314 ** file. For this reason, we have to determine the fragment
315 ** name, and we cannot use the library entry point but we have
316 ** to locate the correct init routine "by hand".
Jack Jansen5d9acb61995-06-14 14:54:25 +0000317 */
Jack Jansen4e043731995-02-13 22:42:34 +0000318 {
319 FSSpec libspec;
320 CFragConnectionID connID;
Guido van Rossum6a75d261995-02-18 14:51:15 +0000321 Ptr mainAddr;
322 Str255 errMessage;
323 OSErr err;
Jack Jansen5d9acb61995-06-14 14:54:25 +0000324 Boolean isfolder, didsomething;
325 char buf[512];
326 Str63 fragname;
327 Ptr symAddr;
328 CFragSymbolClass class;
Jack Jansen4e043731995-02-13 22:42:34 +0000329
Jack Jansen5d9acb61995-06-14 14:54:25 +0000330 /* First resolve any aliases to find the real file */
Jack Jansen4e043731995-02-13 22:42:34 +0000331 (void)FSMakeFSSpec(0, 0, Pstring(pathname), &libspec);
Jack Jansen5d9acb61995-06-14 14:54:25 +0000332 err = ResolveAliasFile(&libspec, 1, &isfolder, &didsomething);
333 if ( err ) {
Guido van Rossumbc2472d1997-04-30 19:07:54 +0000334 sprintf(buf, "%.255s: %.200s",
335 pathname, PyMac_StrError(err));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000336 PyErr_SetString(PyExc_ImportError, buf);
Jack Jansen5d9acb61995-06-14 14:54:25 +0000337 return NULL;
338 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000339 /* Next, determine the fragment name,
340 by stripping '.slb' and 'module' */
Jack Jansen5d9acb61995-06-14 14:54:25 +0000341 memcpy(fragname+1, libspec.name+1, libspec.name[0]);
342 fragname[0] = libspec.name[0];
Guido van Rossum79f25d91997-04-29 20:08:16 +0000343 if( strncmp((char *)(fragname+1+fragname[0]-4),
344 ".slb", 4) == 0 )
Jack Jansen5d9acb61995-06-14 14:54:25 +0000345 fragname[0] -= 4;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000346 if ( strncmp((char *)(fragname+1+fragname[0]-6),
347 "module", 6) == 0 )
Jack Jansen5d9acb61995-06-14 14:54:25 +0000348 fragname[0] -= 6;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000349 /* Load the fragment
350 (or return the connID if it is already loaded */
Jack Jansen5d9acb61995-06-14 14:54:25 +0000351 err = GetDiskFragment(&libspec, 0, 0, fragname,
Guido van Rossum6a75d261995-02-18 14:51:15 +0000352 kLoadCFrag, &connID, &mainAddr,
353 errMessage);
Jack Jansen4e043731995-02-13 22:42:34 +0000354 if ( err ) {
Guido van Rossumbc2472d1997-04-30 19:07:54 +0000355 sprintf(buf, "%.*s: %.200s",
356 errMessage[0], errMessage+1,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000357 PyMac_StrError(err));
358 PyErr_SetString(PyExc_ImportError, buf);
Jack Jansen4e043731995-02-13 22:42:34 +0000359 return NULL;
360 }
Jack Jansen5d9acb61995-06-14 14:54:25 +0000361 /* Locate the address of the correct init function */
362 err = FindSymbol(connID, Pstring(funcname), &symAddr, &class);
363 if ( err ) {
Guido van Rossumbc2472d1997-04-30 19:07:54 +0000364 sprintf(buf, "%s: %.200s",
365 funcname, PyMac_StrError(err));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000366 PyErr_SetString(PyExc_ImportError, buf);
Jack Jansen5d9acb61995-06-14 14:54:25 +0000367 return NULL;
368 }
369 p = (dl_funcptr)symAddr;
Jack Jansen4e043731995-02-13 22:42:34 +0000370 }
Jack Jansen5d9acb61995-06-14 14:54:25 +0000371#endif /* USE_MAC_DYNAMIC_LOADING */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000372#ifdef USE_SHLIB
373 {
374#ifdef RTLD_NOW
375 /* RTLD_NOW: resolve externals now
376 (i.e. core dump now if some are missing) */
Guido van Rossum6b077871998-05-18 13:42:45 +0000377 void *handle = dlopen(pathname, RTLD_NOW);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000378#else
379 void *handle;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000380 if (Py_VerboseFlag)
Guido van Rossum08052c71997-12-02 20:43:18 +0000381 printf("dlopen(\"%s\", %d);\n", pathname,
Guido van Rossum6b077871998-05-18 13:42:45 +0000382 RTLD_LAZY);
383 handle = dlopen(pathname, RTLD_LAZY);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000384#endif /* RTLD_NOW */
385 if (handle == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000386 PyErr_SetString(PyExc_ImportError, dlerror());
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000387 return NULL;
388 }
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000389 if (fp != NULL && nhandles < 128)
390 handles[nhandles++].handle = handle;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000391 p = (dl_funcptr) dlsym(handle, funcname);
392 }
393#endif /* USE_SHLIB */
394#ifdef _AIX
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000395 /*
396 -- Invoke load() with L_NOAUTODEFER leaving the imported symbols
397 -- of the shared module unresolved. Thus we have to resolve them
398 -- explicitely with loadbind. The new module is loaded, then we
399 -- resolve its symbols using the list of already loaded modules
400 -- (only those that belong to the python executable). Get these
401 -- with loadquery(L_GETINFO).
402 */
403 {
404 static void *staticmodlistptr = NULL;
405
406 if (!staticmodlistptr)
407 if (aix_getoldmodules(&staticmodlistptr) == -1)
408 return NULL;
409 p = (dl_funcptr) load(pathname, L_NOAUTODEFER, 0);
410 if (p == NULL) {
411 aix_loaderror(pathname);
412 return NULL;
413 }
414 if (aix_bindnewmodule((void *)p, staticmodlistptr) == -1) {
415 aix_loaderror(pathname);
416 return NULL;
417 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000418 }
419#endif /* _AIX */
Guido van Rossum9b38a141996-09-11 23:12:24 +0000420#ifdef MS_WIN32
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000421 {
422 HINSTANCE hDLL;
Guido van Rossuma5e1b001998-06-27 21:53:17 +0000423 char pathbuf[260];
424 if (strchr(pathname, SEP) == NULL &&
425 strchr(pathname, ALTSEP) == NULL)
426 {
427 /* Prefix bare filename with ".\" */
428 char *p = pathbuf;
429 *p = '\0';
430 _getcwd(pathbuf, sizeof pathbuf);
431 if (*p != '\0' && p[1] == ':')
432 p += 2;
433 sprintf(p, ".\\%-.255s", pathname);
434 pathname = pathbuf;
435 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000436 hDLL = LoadLibrary(pathname);
437 if (hDLL==NULL){
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000438 char errBuf[256];
439 unsigned int errorCode;
440
441 /* Get an error string from Win32 error code */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000442 char theInfo[256]; /* Pointer to error text
443 from system */
444 int theLength; /* Length of error text */
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000445
446 errorCode = GetLastError();
447
Guido van Rossum79f25d91997-04-29 20:08:16 +0000448 theLength = FormatMessage(
449 FORMAT_MESSAGE_FROM_SYSTEM, /* flags */
450 NULL, /* message source */
451 errorCode, /* the message (error) ID */
452 0, /* default language environment */
453 (LPTSTR) theInfo, /* the buffer */
454 sizeof(theInfo), /* the buffer size */
455 NULL); /* no additional format args. */
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000456
Guido van Rossum79f25d91997-04-29 20:08:16 +0000457 /* Problem: could not get the error message.
458 This should not happen if called correctly. */
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000459 if (theLength == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000460 sprintf(errBuf,
461 "DLL load failed with error code %d",
462 errorCode);
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000463 } else {
464 int len;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000465 /* For some reason a \r\n
466 is appended to the text */
467 if (theLength >= 2 &&
468 theInfo[theLength-2] == '\r' &&
469 theInfo[theLength-1] == '\n') {
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000470 theLength -= 2;
471 theInfo[theLength] = '\0';
472 }
473 strcpy(errBuf, "DLL load failed: ");
474 len = strlen(errBuf);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000475 strncpy(errBuf+len, theInfo,
476 sizeof(errBuf)-len);
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000477 errBuf[sizeof(errBuf)-1] = '\0';
478 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000479 PyErr_SetString(PyExc_ImportError, errBuf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000480 return NULL;
481 }
482 p = GetProcAddress(hDLL, funcname);
483 }
Guido van Rossum9b38a141996-09-11 23:12:24 +0000484#endif /* MS_WIN32 */
485#ifdef MS_WIN16
Guido van Rossumdadc8241996-05-23 22:51:40 +0000486 {
487 HINSTANCE hDLL;
Guido van Rossuma5e1b001998-06-27 21:53:17 +0000488 char pathbuf[16];
489 if (strchr(pathname, SEP) == NULL &&
490 strchr(pathname, ALTSEP) == NULL)
491 {
492 /* Prefix bare filename with ".\" */
493 sprintf(pathbuf, ".\\%-.13s", pathname);
494 pathname = pathbuf;
495 }
Guido van Rossumdadc8241996-05-23 22:51:40 +0000496 hDLL = LoadLibrary(pathname);
497 if (hDLL < HINSTANCE_ERROR){
498 char errBuf[256];
Guido van Rossum79f25d91997-04-29 20:08:16 +0000499 sprintf(errBuf,
500 "DLL load failed with error code %d", hDLL);
501 PyErr_SetString(PyExc_ImportError, errBuf);
Guido van Rossumdadc8241996-05-23 22:51:40 +0000502 return NULL;
503 }
504 p = GetProcAddress(hDLL, funcname);
505 }
Guido van Rossum9b38a141996-09-11 23:12:24 +0000506#endif /* MS_WIN16 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000507
508#if defined(PYOS_OS2)
509 {
510 APIRET rc;
511 HMODULE hDLL;
Guido van Rossumbb71ab61998-07-08 13:47:12 +0000512 char failreason[256];
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000513
514 rc = DosLoadModule(failreason,
Guido van Rossumbb71ab61998-07-08 13:47:12 +0000515 sizeof(failreason),
516 pathname,
517 &hDLL);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000518
519 if (rc != NO_ERROR) {
520 char errBuf[256];
521 sprintf(errBuf,
Guido van Rossumbb71ab61998-07-08 13:47:12 +0000522 "DLL load failed, rc = %d, problem '%s': %s",
523 rc, failreason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000524 PyErr_SetString(PyExc_ImportError, errBuf);
525 return NULL;
526 }
527
Guido van Rossumbb71ab61998-07-08 13:47:12 +0000528 rc = DosQueryProcAddr(hDLL, 0L, funcname, &p);
529 if (rc != NO_ERROR)
530 p = NULL; /* Signify Failure to Acquire Entrypoint */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000531 }
532#endif /* PYOS_OS2 */
533
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000534#ifdef USE_DL
Guido van Rossum79f25d91997-04-29 20:08:16 +0000535 p = dl_loadmod(Py_GetProgramName(), pathname, funcname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000536#endif /* USE_DL */
537#ifdef USE_RLD
538 {
539 NXStream *errorStream;
540 struct mach_header *new_header;
541 const char *filenames[2];
542 long ret;
543 unsigned long ptr;
544
545 errorStream = NXOpenMemory(NULL, 0, NX_WRITEONLY);
546 filenames[0] = pathname;
547 filenames[1] = NULL;
548 ret = rld_load(errorStream, &new_header,
549 filenames, NULL);
550
551 /* extract the error messages for the exception */
552 if(!ret) {
553 char *streamBuf;
554 int len, maxLen;
555
556 NXPutc(errorStream, (char)0);
557
558 NXGetMemoryBuffer(errorStream,
559 &streamBuf, &len, &maxLen);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000560 PyErr_SetString(PyExc_ImportError, streamBuf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000561 }
562
563 if(ret && rld_lookup(errorStream, funcname, &ptr))
564 p = (dl_funcptr) ptr;
565
566 NXCloseMemory(errorStream, NX_FREEBUFFER);
567
568 if(!ret)
569 return NULL;
570 }
571#endif /* USE_RLD */
572#ifdef hpux
573 {
574 shl_t lib;
575 int flags;
576
Guido van Rossum3afb5951996-12-05 23:15:35 +0000577 flags = BIND_FIRST | BIND_DEFERRED;
Guido van Rossumbb71ab61998-07-08 13:47:12 +0000578 if (Py_VerboseFlag) {
579 flags = DYNAMIC_PATH | BIND_FIRST | BIND_IMMEDIATE |
Guido van Rossum79f25d91997-04-29 20:08:16 +0000580 BIND_NONFATAL | BIND_VERBOSE;
Guido van Rossumbb71ab61998-07-08 13:47:12 +0000581 printf("shl_load %s\n",pathname);
582 }
583 lib = shl_load(pathname, flags, 0);
584 /* XXX Chuck Blake once wrote that 0 should be BIND_NOSTART? */
585 if (lib == NULL) {
586 char buf[256];
587 if (Py_VerboseFlag)
588 perror(pathname);
589 sprintf(buf, "Failed to load %.200s", pathname);
590 PyErr_SetString(PyExc_ImportError, buf);
591 return NULL;
592 }
593 if (Py_VerboseFlag)
594 printf("shl_findsym %s\n", funcname);
595 shl_findsym(&lib, funcname, TYPE_UNDEFINED, (void *) &p);
596 if (p == NULL && Py_VerboseFlag)
597 perror(funcname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000598 }
599#endif /* hpux */
Guido van Rossum644a12b1997-04-09 19:24:53 +0000600#ifdef USE_SHLIB
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000601 got_it:
Guido van Rossum644a12b1997-04-09 19:24:53 +0000602#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000603 if (p == NULL) {
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000604 PyErr_Format(PyExc_ImportError,
Guido van Rossum42e8e5d1998-01-19 22:23:08 +0000605 "dynamic module does not define init function (%.200s)",
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000606 funcname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000607 return NULL;
608 }
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000609 _Py_PackageContext = packagecontext;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000610 (*p)();
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000611 _Py_PackageContext = NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000612 if (PyErr_Occurred())
613 return NULL;
614 if (_PyImport_FixupExtension(name, pathname) == NULL)
615 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000616
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000617 m = PyDict_GetItemString(PyImport_GetModuleDict(), name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000618 if (m == NULL) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000619 PyErr_SetString(PyExc_SystemError,
620 "dynamic module not initialized properly");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000621 return NULL;
622 }
Guido van Rossum1e612491996-08-19 22:12:10 +0000623 /* Remember the filename as the __file__ attribute */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000624 d = PyModule_GetDict(m);
625 s = PyString_FromString(pathname);
626 if (s == NULL || PyDict_SetItemString(d, "__file__", s) != 0)
627 PyErr_Clear(); /* Not important enough to report */
628 Py_XDECREF(s);
629 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000630 fprintf(stderr,
631 "import %s # dynamically loaded from %s\n",
632 name, pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000633 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000634 return m;
635#endif /* DYNAMIC_LINK */
636}
637
638
639#ifdef _AIX
640
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000641#include <ctype.h> /* for isdigit() */
642#include <errno.h> /* for global errno */
643#include <string.h> /* for strerror() */
644#include <stdlib.h> /* for malloc(), free() */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000645
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000646typedef struct Module {
647 struct Module *next;
648 void *entry;
649} Module, *ModulePtr;
650
651static int
652aix_getoldmodules(modlistptr)
653 void **modlistptr;
654{
655 register ModulePtr modptr, prevmodptr;
656 register struct ld_info *ldiptr;
657 register char *ldibuf;
658 register int errflag, bufsize = 1024;
659 register unsigned int offset;
660
661 /*
662 -- Get the list of loaded modules into ld_info structures.
663 */
664 if ((ldibuf = malloc(bufsize)) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000665 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000666 return -1;
667 }
668 while ((errflag = loadquery(L_GETINFO, ldibuf, bufsize)) == -1
669 && errno == ENOMEM) {
670 free(ldibuf);
671 bufsize += 1024;
672 if ((ldibuf = malloc(bufsize)) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000673 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000674 return -1;
675 }
676 }
677 if (errflag == -1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000678 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000679 return -1;
680 }
681 /*
682 -- Make the modules list from the ld_info structures.
683 */
684 ldiptr = (struct ld_info *)ldibuf;
685 prevmodptr = NULL;
686 do {
Guido van Rossum3b31cd21997-10-10 17:40:00 +0000687 if (strstr(ldiptr->ldinfo_filename, "python") == NULL) {
688 /*
689 -- Extract only the modules containing "python" as a
690 -- substring, like the "python[version]" executable or
691 -- "libpython[version].a" in case python is embedded.
692 */
693 offset = (unsigned int)ldiptr->ldinfo_next;
694 ldiptr = (struct ld_info *)((unsigned int)
695 ldiptr + offset);
696 continue;
697 }
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000698 if ((modptr = (ModulePtr)malloc(sizeof(Module))) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000699 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000700 while (*modlistptr) {
701 modptr = (ModulePtr)*modlistptr;
702 *modlistptr = (void *)modptr->next;
703 free(modptr);
704 }
705 return -1;
706 }
707 modptr->entry = ldiptr->ldinfo_dataorg;
708 modptr->next = NULL;
709 if (prevmodptr == NULL)
710 *modlistptr = (void *)modptr;
711 else
712 prevmodptr->next = modptr;
713 prevmodptr = modptr;
714 offset = (unsigned int)ldiptr->ldinfo_next;
715 ldiptr = (struct ld_info *)((unsigned int)ldiptr + offset);
716 } while (offset);
717 free(ldibuf);
718 return 0;
719}
720
721static int
722aix_bindnewmodule(newmoduleptr, modlistptr)
723 void *newmoduleptr;
724 void *modlistptr;
725{
726 register ModulePtr modptr;
727
728 /*
729 -- Bind the new module with the list of loaded modules.
730 */
731 for (modptr = (ModulePtr)modlistptr; modptr; modptr = modptr->next)
732 if (loadbind(0, modptr->entry, newmoduleptr) != 0)
733 return -1;
734 return 0;
735}
736
737static void
738aix_loaderror(pathname)
739 char *pathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000740{
741
Guido van Rossum236f62d1996-06-26 21:07:08 +0000742 char *message[1024], errbuf[1024];
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000743 register int i,j;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000744
745 struct errtab {
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000746 int errNo;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000747 char *errstr;
748 } load_errtab[] = {
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000749 {L_ERROR_TOOMANY, "too many errors, rest skipped."},
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000750 {L_ERROR_NOLIB, "can't load library:"},
751 {L_ERROR_UNDEF, "can't find symbol in library:"},
752 {L_ERROR_RLDBAD,
753 "RLD index out of range or bad relocation type:"},
754 {L_ERROR_FORMAT, "not a valid, executable xcoff file:"},
755 {L_ERROR_MEMBER,
756 "file not an archive or does not contain requested member:"},
757 {L_ERROR_TYPE, "symbol table mismatch:"},
Guido van Rossum236f62d1996-06-26 21:07:08 +0000758 {L_ERROR_ALIGN, "text alignment in file is wrong."},
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000759 {L_ERROR_SYSTEM, "System error:"},
760 {L_ERROR_ERRNO, NULL}
761 };
762
763#define LOAD_ERRTAB_LEN (sizeof(load_errtab)/sizeof(load_errtab[0]))
764#define ERRBUF_APPEND(s) strncat(errbuf, s, sizeof(errbuf)-strlen(errbuf)-1)
765
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000766 sprintf(errbuf, "from module %.200s ", pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000767
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000768 if (!loadquery(L_GETMESSAGES, &message[0], sizeof(message))) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000769 ERRBUF_APPEND(strerror(errno));
Guido van Rossum236f62d1996-06-26 21:07:08 +0000770 ERRBUF_APPEND("\n");
771 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000772 for(i = 0; message[i] && *message[i]; i++) {
773 int nerr = atoi(message[i]);
774 for (j=0; j<LOAD_ERRTAB_LEN ; j++) {
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000775 if (nerr == load_errtab[j].errNo && load_errtab[j].errstr)
Guido van Rossum236f62d1996-06-26 21:07:08 +0000776 ERRBUF_APPEND(load_errtab[j].errstr);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000777 }
778 while (isdigit(*message[i])) message[i]++ ;
779 ERRBUF_APPEND(message[i]);
780 ERRBUF_APPEND("\n");
781 }
782 errbuf[strlen(errbuf)-1] = '\0'; /* trim off last newline */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000783 PyErr_SetString(PyExc_ImportError, errbuf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000784 return;
785}
786
787#endif /* _AIX */