blob: 5d78bab8857856fdd2701601072d0041ee2b060e [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;
512 char failreason[256];
513
514 rc = DosLoadModule(failreason,
515 sizeof(failreason),
516 pathname,
517 &hDLL);
518
519 if (rc != NO_ERROR) {
520 char errBuf[256];
521 sprintf(errBuf,
522 "DLL load failed, rc = %d, problem '%s': %s", rc, failreason);
523 PyErr_SetString(PyExc_ImportError, errBuf);
524 return NULL;
525 }
526
527 rc = DosQueryProcAddr(hDLL, 0L, funcname, &p);
528 if (rc != NO_ERROR)
529 p = NULL; /* Signify Failure to Acquire Entrypoint */
530 }
531#endif /* PYOS_OS2 */
532
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000533#ifdef USE_DL
Guido van Rossum79f25d91997-04-29 20:08:16 +0000534 p = dl_loadmod(Py_GetProgramName(), pathname, funcname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000535#endif /* USE_DL */
536#ifdef USE_RLD
537 {
538 NXStream *errorStream;
539 struct mach_header *new_header;
540 const char *filenames[2];
541 long ret;
542 unsigned long ptr;
543
544 errorStream = NXOpenMemory(NULL, 0, NX_WRITEONLY);
545 filenames[0] = pathname;
546 filenames[1] = NULL;
547 ret = rld_load(errorStream, &new_header,
548 filenames, NULL);
549
550 /* extract the error messages for the exception */
551 if(!ret) {
552 char *streamBuf;
553 int len, maxLen;
554
555 NXPutc(errorStream, (char)0);
556
557 NXGetMemoryBuffer(errorStream,
558 &streamBuf, &len, &maxLen);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000559 PyErr_SetString(PyExc_ImportError, streamBuf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000560 }
561
562 if(ret && rld_lookup(errorStream, funcname, &ptr))
563 p = (dl_funcptr) ptr;
564
565 NXCloseMemory(errorStream, NX_FREEBUFFER);
566
567 if(!ret)
568 return NULL;
569 }
570#endif /* USE_RLD */
571#ifdef hpux
572 {
573 shl_t lib;
574 int flags;
575
Guido van Rossum3afb5951996-12-05 23:15:35 +0000576 flags = BIND_FIRST | BIND_DEFERRED;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000577 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000578 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000579 flags = DYNAMIC_PATH | BIND_FIRST | BIND_IMMEDIATE |
580 BIND_NONFATAL | BIND_VERBOSE;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000581 printf("shl_load %s\n",pathname);
582 }
583 lib = shl_load(pathname, flags, 0);
Guido van Rossum6b077871998-05-18 13:42:45 +0000584 /* XXX Chuck Blake once wrote that 0 should be BIND_NOSTART? */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000585 if (lib == NULL)
586 {
587 char buf[256];
Guido van Rossum79f25d91997-04-29 20:08:16 +0000588 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000589 perror(pathname);
590 sprintf(buf, "Failed to load %.200s", pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000591 PyErr_SetString(PyExc_ImportError, buf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000592 return NULL;
593 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000594 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000595 printf("shl_findsym %s\n", funcname);
596 shl_findsym(&lib, funcname, TYPE_UNDEFINED, (void *) &p);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000597 if (p == NULL && Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000598 perror(funcname);
599 }
600#endif /* hpux */
Guido van Rossum644a12b1997-04-09 19:24:53 +0000601#ifdef USE_SHLIB
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000602 got_it:
Guido van Rossum644a12b1997-04-09 19:24:53 +0000603#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000604 if (p == NULL) {
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000605 PyErr_Format(PyExc_ImportError,
Guido van Rossum42e8e5d1998-01-19 22:23:08 +0000606 "dynamic module does not define init function (%.200s)",
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000607 funcname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000608 return NULL;
609 }
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000610 _Py_PackageContext = packagecontext;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000611 (*p)();
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000612 _Py_PackageContext = NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000613 if (PyErr_Occurred())
614 return NULL;
615 if (_PyImport_FixupExtension(name, pathname) == NULL)
616 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000617
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000618 m = PyDict_GetItemString(PyImport_GetModuleDict(), name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000619 if (m == NULL) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000620 PyErr_SetString(PyExc_SystemError,
621 "dynamic module not initialized properly");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000622 return NULL;
623 }
Guido van Rossum1e612491996-08-19 22:12:10 +0000624 /* Remember the filename as the __file__ attribute */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000625 d = PyModule_GetDict(m);
626 s = PyString_FromString(pathname);
627 if (s == NULL || PyDict_SetItemString(d, "__file__", s) != 0)
628 PyErr_Clear(); /* Not important enough to report */
629 Py_XDECREF(s);
630 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000631 fprintf(stderr,
632 "import %s # dynamically loaded from %s\n",
633 name, pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000634 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000635 return m;
636#endif /* DYNAMIC_LINK */
637}
638
639
640#ifdef _AIX
641
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000642#include <ctype.h> /* for isdigit() */
643#include <errno.h> /* for global errno */
644#include <string.h> /* for strerror() */
645#include <stdlib.h> /* for malloc(), free() */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000646
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000647typedef struct Module {
648 struct Module *next;
649 void *entry;
650} Module, *ModulePtr;
651
652static int
653aix_getoldmodules(modlistptr)
654 void **modlistptr;
655{
656 register ModulePtr modptr, prevmodptr;
657 register struct ld_info *ldiptr;
658 register char *ldibuf;
659 register int errflag, bufsize = 1024;
660 register unsigned int offset;
661
662 /*
663 -- Get the list of loaded modules into ld_info structures.
664 */
665 if ((ldibuf = malloc(bufsize)) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000666 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000667 return -1;
668 }
669 while ((errflag = loadquery(L_GETINFO, ldibuf, bufsize)) == -1
670 && errno == ENOMEM) {
671 free(ldibuf);
672 bufsize += 1024;
673 if ((ldibuf = malloc(bufsize)) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000674 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000675 return -1;
676 }
677 }
678 if (errflag == -1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000679 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000680 return -1;
681 }
682 /*
683 -- Make the modules list from the ld_info structures.
684 */
685 ldiptr = (struct ld_info *)ldibuf;
686 prevmodptr = NULL;
687 do {
Guido van Rossum3b31cd21997-10-10 17:40:00 +0000688 if (strstr(ldiptr->ldinfo_filename, "python") == NULL) {
689 /*
690 -- Extract only the modules containing "python" as a
691 -- substring, like the "python[version]" executable or
692 -- "libpython[version].a" in case python is embedded.
693 */
694 offset = (unsigned int)ldiptr->ldinfo_next;
695 ldiptr = (struct ld_info *)((unsigned int)
696 ldiptr + offset);
697 continue;
698 }
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000699 if ((modptr = (ModulePtr)malloc(sizeof(Module))) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000700 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000701 while (*modlistptr) {
702 modptr = (ModulePtr)*modlistptr;
703 *modlistptr = (void *)modptr->next;
704 free(modptr);
705 }
706 return -1;
707 }
708 modptr->entry = ldiptr->ldinfo_dataorg;
709 modptr->next = NULL;
710 if (prevmodptr == NULL)
711 *modlistptr = (void *)modptr;
712 else
713 prevmodptr->next = modptr;
714 prevmodptr = modptr;
715 offset = (unsigned int)ldiptr->ldinfo_next;
716 ldiptr = (struct ld_info *)((unsigned int)ldiptr + offset);
717 } while (offset);
718 free(ldibuf);
719 return 0;
720}
721
722static int
723aix_bindnewmodule(newmoduleptr, modlistptr)
724 void *newmoduleptr;
725 void *modlistptr;
726{
727 register ModulePtr modptr;
728
729 /*
730 -- Bind the new module with the list of loaded modules.
731 */
732 for (modptr = (ModulePtr)modlistptr; modptr; modptr = modptr->next)
733 if (loadbind(0, modptr->entry, newmoduleptr) != 0)
734 return -1;
735 return 0;
736}
737
738static void
739aix_loaderror(pathname)
740 char *pathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000741{
742
Guido van Rossum236f62d1996-06-26 21:07:08 +0000743 char *message[1024], errbuf[1024];
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000744 register int i,j;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000745
746 struct errtab {
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000747 int errNo;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000748 char *errstr;
749 } load_errtab[] = {
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000750 {L_ERROR_TOOMANY, "too many errors, rest skipped."},
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000751 {L_ERROR_NOLIB, "can't load library:"},
752 {L_ERROR_UNDEF, "can't find symbol in library:"},
753 {L_ERROR_RLDBAD,
754 "RLD index out of range or bad relocation type:"},
755 {L_ERROR_FORMAT, "not a valid, executable xcoff file:"},
756 {L_ERROR_MEMBER,
757 "file not an archive or does not contain requested member:"},
758 {L_ERROR_TYPE, "symbol table mismatch:"},
Guido van Rossum236f62d1996-06-26 21:07:08 +0000759 {L_ERROR_ALIGN, "text alignment in file is wrong."},
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000760 {L_ERROR_SYSTEM, "System error:"},
761 {L_ERROR_ERRNO, NULL}
762 };
763
764#define LOAD_ERRTAB_LEN (sizeof(load_errtab)/sizeof(load_errtab[0]))
765#define ERRBUF_APPEND(s) strncat(errbuf, s, sizeof(errbuf)-strlen(errbuf)-1)
766
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000767 sprintf(errbuf, "from module %.200s ", pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000768
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000769 if (!loadquery(L_GETMESSAGES, &message[0], sizeof(message))) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000770 ERRBUF_APPEND(strerror(errno));
Guido van Rossum236f62d1996-06-26 21:07:08 +0000771 ERRBUF_APPEND("\n");
772 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000773 for(i = 0; message[i] && *message[i]; i++) {
774 int nerr = atoi(message[i]);
775 for (j=0; j<LOAD_ERRTAB_LEN ; j++) {
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000776 if (nerr == load_errtab[j].errNo && load_errtab[j].errstr)
Guido van Rossum236f62d1996-06-26 21:07:08 +0000777 ERRBUF_APPEND(load_errtab[j].errstr);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000778 }
779 while (isdigit(*message[i])) message[i]++ ;
780 ERRBUF_APPEND(message[i]);
781 ERRBUF_APPEND("\n");
782 }
783 errbuf[strlen(errbuf)-1] = '\0'; /* trim off last newline */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000784 PyErr_SetString(PyExc_ImportError, errbuf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000785 return;
786}
787
788#endif /* _AIX */