blob: b11e1e32269a8ea06cd7360947895e98cbb93b2a [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 Rossum1ae940a1995-01-02 19:04:15 +000036#include "osdefs.h"
37#include "importdl.h"
38
Guido van Rossum1ae940a1995-01-02 19:04:15 +000039/* Explanation of some of the the various #defines used by dynamic linking...
40
41 symbol -- defined for:
42
43 DYNAMIC_LINK -- any kind of dynamic linking
Guido van Rossum75f288d1995-06-14 22:07:26 +000044 USE_RLD -- NeXT dynamic linking
Guido van Rossum1ae940a1995-01-02 19:04:15 +000045 USE_DL -- Jack's dl for IRIX 4 or GNU dld with emulation for Jack's dl
46 USE_SHLIB -- SunOS or IRIX 5 (SVR4?) shared libraries
47 _AIX -- AIX style dynamic linking
Guido van Rossum9b38a141996-09-11 23:12:24 +000048 MS_WIN32 -- Windows NT style dynamic linking (using DLLs)
49 MS_WIN16 -- Windows 16-bit dynamic linking (using DLLs)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000050 PYOS_OS2 -- IBM OS/2 dynamic linking (using DLLs)
Guido van Rossum1ae940a1995-01-02 19:04:15 +000051 _DL_FUNCPTR_DEFINED -- if the typedef dl_funcptr has been defined
Jack Jansen5d9acb61995-06-14 14:54:25 +000052 USE_MAC_DYNAMIC_LOADING -- Mac CFM shared libraries
Guido van Rossum1ae940a1995-01-02 19:04:15 +000053 SHORT_EXT -- short extension for dynamic module, e.g. ".so"
54 LONG_EXT -- long extension, e.g. "module.so"
55 hpux -- HP-UX Dynamic Linking - defined by the compiler
Guido van Rossum46c76a61995-01-20 16:53:54 +000056 __NetBSD__ -- NetBSD shared libraries (not quite SVR4 compatible)
Guido van Rossum25e85291996-02-25 05:02:29 +000057 __FreeBSD__ -- FreeBSD shared libraries
Guido van Rossum1ae940a1995-01-02 19:04:15 +000058
59 (The other WITH_* symbols are used only once, to set the
60 appropriate symbols.)
61*/
62
63/* Configure dynamic linking */
64
Guido van Rossumff4af061996-01-12 01:17:50 +000065#ifdef __hpux
Guido van Rossum1e612491996-08-19 22:12:10 +000066#ifndef hpux
Guido van Rossumff4af061996-01-12 01:17:50 +000067#define hpux
68#endif
Guido van Rossum1e612491996-08-19 22:12:10 +000069#endif
Guido van Rossumff4af061996-01-12 01:17:50 +000070
Guido van Rossum1ae940a1995-01-02 19:04:15 +000071#ifdef hpux
72#define DYNAMIC_LINK
73#include <errno.h>
74typedef void (*dl_funcptr)();
75#define _DL_FUNCPTR_DEFINED 1
76#define SHORT_EXT ".sl"
77#define LONG_EXT "module.sl"
78#endif
79
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000080#if defined(PYOS_OS2)
81#define DYNAMIC_LINK
82#define INCL_DOSERRORS
83#define INCL_DOSMODULEMGR
84#include <os2.h>
85typedef int (* APIENTRY dl_funcptr)();
86#define _DL_FUNCPTR_DEFINED 1
87#define SHORT_EXT ".pyd"
88#define LONG_EXT ".dll"
89#endif
90
Guido van Rossum9218b701997-05-05 15:03:26 +000091#if defined(__NetBSD__)
Guido van Rossum46c76a61995-01-20 16:53:54 +000092#define DYNAMIC_LINK
93#define USE_SHLIB
94
95#define dlerror() "error in dynamic linking"
96#endif
97
Guido van Rossum9b38a141996-09-11 23:12:24 +000098#ifdef MS_WINDOWS /* i.e. MS_WIN32 or MS_WIN16 */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000099#define DYNAMIC_LINK
100#include <windows.h>
101typedef FARPROC dl_funcptr;
102#define _DL_FUNCPTR_DEFINED
Guido van Rossum5fb1da71995-01-07 12:36:02 +0000103#define SHORT_EXT ".pyd"
Guido van Rossume71a9471996-04-09 02:39:15 +0000104#define LONG_EXT ".dll"
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000105#endif
106
Guido van Rossum75f288d1995-06-14 22:07:26 +0000107#ifdef NeXT
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000108#define DYNAMIC_LINK
109#define USE_RLD
Guido van Rossum54dec591997-08-16 14:38:09 +0000110#define SHORT_EXT ".so"
111#define LONG_EXT "module.so"
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000112#endif
113
114#ifdef WITH_SGI_DL
115#define DYNAMIC_LINK
116#define USE_DL
117#endif
118
119#ifdef WITH_DL_DLD
120#define DYNAMIC_LINK
121#define USE_DL
122#endif
123
Jack Jansen5d9acb61995-06-14 14:54:25 +0000124#ifdef USE_MAC_DYNAMIC_LOADING
Jack Jansen4e043731995-02-13 22:42:34 +0000125#define DYNAMIC_LINK
Guido van Rossum6a75d261995-02-18 14:51:15 +0000126#define SHORT_EXT ".slb"
Guido van Rossum1e612491996-08-19 22:12:10 +0000127#ifdef __CFM68K__
128#define LONG_EXT ".CFM68K.slb"
129#else
130#define LONG_EXT ".ppc.slb"
131#endif
Jack Jansen4e043731995-02-13 22:42:34 +0000132#ifndef _DL_FUNCPTR_DEFINED
133typedef void (*dl_funcptr)();
134#endif
135#endif
136
Guido van Rossum504f4a91996-08-20 19:59:07 +0000137#if !defined(DYNAMIC_LINK) && (defined(HAVE_DLOPEN) || defined(M_UNIX))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000138#define DYNAMIC_LINK
139#define USE_SHLIB
140#endif
141
142#ifdef _AIX
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000143#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 +0000144#define DYNAMIC_LINK
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000145#define SHORT_EXT ".so"
146#define LONG_EXT "module.so"
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000147#include <sys/ldr.h>
148typedef void (*dl_funcptr)();
149#define _DL_FUNCPTR_DEFINED
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000150static int aix_getoldmodules(void **);
151static int aix_bindnewmodule(void *, void *);
152static void aix_loaderror(char *);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000153#endif
154
155#ifdef DYNAMIC_LINK
156
157#ifdef USE_SHLIB
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000158#include <sys/types.h>
159#include <sys/stat.h>
Guido van Rossum9218b701997-05-05 15:03:26 +0000160#if defined(__NetBSD__)
Guido van Rossum46c76a61995-01-20 16:53:54 +0000161#include <nlist.h>
162#include <link.h>
163#else
Guido van Rossum504f4a91996-08-20 19:59:07 +0000164#ifdef HAVE_DLFCN_H
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000165#include <dlfcn.h>
Guido van Rossum46c76a61995-01-20 16:53:54 +0000166#endif
Guido van Rossum504f4a91996-08-20 19:59:07 +0000167#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000168#ifndef _DL_FUNCPTR_DEFINED
169typedef void (*dl_funcptr)();
170#endif
171#ifndef RTLD_LAZY
172#define RTLD_LAZY 1
173#endif
174#define SHORT_EXT ".so"
175#define LONG_EXT "module.so"
176#endif /* USE_SHLIB */
177
178#if defined(USE_DL) || defined(hpux)
179#include "dl.h"
180#endif
181
Jack Jansen5d9acb61995-06-14 14:54:25 +0000182#ifdef USE_MAC_DYNAMIC_LOADING
Jack Jansen0a72e8d1995-10-23 13:54:01 +0000183#include <Aliases.h>
Jack Jansen4e043731995-02-13 22:42:34 +0000184#include <CodeFragments.h>
Guido van Rossum79f25d91997-04-29 20:08:16 +0000185#ifdef SYMANTEC__CFM68K__ /* Really an older version of Universal Headers */
Guido van Rossum6a75d261995-02-18 14:51:15 +0000186#define CFragConnectionID ConnectionID
187#define kLoadCFrag 0x01
188#endif
Jack Jansen4e043731995-02-13 22:42:34 +0000189#include <Files.h>
190#include "macdefs.h"
191#include "macglue.h"
192#endif
193
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000194#ifdef USE_RLD
195#include <mach-o/rld.h>
196#define FUNCNAME_PATTERN "_init%.200s"
197#ifndef _DL_FUNCPTR_DEFINED
198typedef void (*dl_funcptr)();
199#endif
200#endif /* USE_RLD */
201
Guido van Rossum79f25d91997-04-29 20:08:16 +0000202extern char *Py_GetProgramName();
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000203
204#ifndef FUNCNAME_PATTERN
Guido van Rossum25e85291996-02-25 05:02:29 +0000205#if defined(__hp9000s300) || defined(__NetBSD__) || defined(__FreeBSD__) || defined(__BORLANDC__)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000206#define FUNCNAME_PATTERN "_init%.200s"
207#else
208#define FUNCNAME_PATTERN "init%.200s"
209#endif
210#endif
211
212#if !defined(SHORT_EXT) && !defined(LONG_EXT)
213#define SHORT_EXT ".o"
214#define LONG_EXT "module.o"
215#endif /* !SHORT_EXT && !LONG_EXT */
216
217#endif /* DYNAMIC_LINK */
218
Guido van Rossum79f25d91997-04-29 20:08:16 +0000219struct filedescr _PyImport_Filetab[] = {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000220#ifdef SHORT_EXT
221 {SHORT_EXT, "rb", C_EXTENSION},
222#endif /* !SHORT_EXT */
223#ifdef LONG_EXT
224 {LONG_EXT, "rb", C_EXTENSION},
225#endif /* !LONG_EXT */
226 {".py", "r", PY_SOURCE},
227 {".pyc", "rb", PY_COMPILED},
228 {0, 0}
229};
230
Guido van Rossum38234201996-07-31 17:55:19 +0000231#ifdef NO_DYNAMIC_LINK
232#undef DYNAMIC_LINK
233#endif
234
Guido van Rossum79f25d91997-04-29 20:08:16 +0000235PyObject *
236_PyImport_LoadDynamicModule(name, pathname, fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000237 char *name;
238 char *pathname;
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000239 FILE *fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000240{
241#ifndef DYNAMIC_LINK
Guido van Rossum79f25d91997-04-29 20:08:16 +0000242 PyErr_SetString(PyExc_ImportError,
243 "dynamically linked modules not supported");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000244 return NULL;
245#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000246 PyObject *m, *d, *s;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000247 char funcname[258];
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000248 char *lastdot, *shortname, *packagecontext;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000249 dl_funcptr p = NULL;
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000250#ifdef USE_SHLIB
251 static struct {
252 dev_t dev;
253 ino_t ino;
254 void *handle;
255 } handles[128];
256 static int nhandles = 0;
Guido van Rossum0bbf2531996-08-09 20:55:05 +0000257 char pathbuf[260];
258 if (strchr(pathname, '/') == NULL) {
259 /* Prefix bare filename with "./" */
260 sprintf(pathbuf, "./%-.255s", pathname);
261 pathname = pathbuf;
262 }
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000263#endif
Guido van Rossum25ce5661997-08-02 03:10:38 +0000264 if ((m = _PyImport_FindExtension(name, pathname)) != NULL) {
265 Py_INCREF(m);
266 return m;
267 }
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000268 lastdot = strrchr(name, '.');
269 if (lastdot == NULL) {
270 packagecontext = NULL;
271 shortname = name;
272 }
273 else {
274 packagecontext = name;
275 shortname = lastdot+1;
276 }
277 sprintf(funcname, FUNCNAME_PATTERN, shortname);
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000278#ifdef USE_SHLIB
279 if (fp != NULL) {
280 int i;
281 struct stat statb;
282 fstat(fileno(fp), &statb);
283 for (i = 0; i < nhandles; i++) {
284 if (statb.st_dev == handles[i].dev &&
285 statb.st_ino == handles[i].ino) {
286 p = (dl_funcptr) dlsym(handles[i].handle,
287 funcname);
288 goto got_it;
289 }
290 }
291 if (nhandles < 128) {
292 handles[nhandles].dev = statb.st_dev;
293 handles[nhandles].ino = statb.st_ino;
294 }
295 }
296#endif /* USE_SHLIB */
Jack Jansen5d9acb61995-06-14 14:54:25 +0000297#ifdef USE_MAC_DYNAMIC_LOADING
298 /*
Guido van Rossum79f25d91997-04-29 20:08:16 +0000299 ** Dynamic loading of CFM shared libraries on the Mac. The
300 ** code has become more convoluted than it was, because we
301 ** want to be able to put multiple modules in a single
302 ** file. For this reason, we have to determine the fragment
303 ** name, and we cannot use the library entry point but we have
304 ** to locate the correct init routine "by hand".
Jack Jansen5d9acb61995-06-14 14:54:25 +0000305 */
Jack Jansen4e043731995-02-13 22:42:34 +0000306 {
307 FSSpec libspec;
308 CFragConnectionID connID;
Guido van Rossum6a75d261995-02-18 14:51:15 +0000309 Ptr mainAddr;
310 Str255 errMessage;
311 OSErr err;
Jack Jansen5d9acb61995-06-14 14:54:25 +0000312 Boolean isfolder, didsomething;
313 char buf[512];
314 Str63 fragname;
315 Ptr symAddr;
316 CFragSymbolClass class;
Jack Jansen4e043731995-02-13 22:42:34 +0000317
Jack Jansen5d9acb61995-06-14 14:54:25 +0000318 /* First resolve any aliases to find the real file */
Jack Jansen4e043731995-02-13 22:42:34 +0000319 (void)FSMakeFSSpec(0, 0, Pstring(pathname), &libspec);
Jack Jansen5d9acb61995-06-14 14:54:25 +0000320 err = ResolveAliasFile(&libspec, 1, &isfolder, &didsomething);
321 if ( err ) {
Guido van Rossumbc2472d1997-04-30 19:07:54 +0000322 sprintf(buf, "%.255s: %.200s",
323 pathname, PyMac_StrError(err));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000324 PyErr_SetString(PyExc_ImportError, buf);
Jack Jansen5d9acb61995-06-14 14:54:25 +0000325 return NULL;
326 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000327 /* Next, determine the fragment name,
328 by stripping '.slb' and 'module' */
Jack Jansen5d9acb61995-06-14 14:54:25 +0000329 memcpy(fragname+1, libspec.name+1, libspec.name[0]);
330 fragname[0] = libspec.name[0];
Guido van Rossum79f25d91997-04-29 20:08:16 +0000331 if( strncmp((char *)(fragname+1+fragname[0]-4),
332 ".slb", 4) == 0 )
Jack Jansen5d9acb61995-06-14 14:54:25 +0000333 fragname[0] -= 4;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000334 if ( strncmp((char *)(fragname+1+fragname[0]-6),
335 "module", 6) == 0 )
Jack Jansen5d9acb61995-06-14 14:54:25 +0000336 fragname[0] -= 6;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000337 /* Load the fragment
338 (or return the connID if it is already loaded */
Jack Jansen5d9acb61995-06-14 14:54:25 +0000339 err = GetDiskFragment(&libspec, 0, 0, fragname,
Guido van Rossum6a75d261995-02-18 14:51:15 +0000340 kLoadCFrag, &connID, &mainAddr,
341 errMessage);
Jack Jansen4e043731995-02-13 22:42:34 +0000342 if ( err ) {
Guido van Rossumbc2472d1997-04-30 19:07:54 +0000343 sprintf(buf, "%.*s: %.200s",
344 errMessage[0], errMessage+1,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000345 PyMac_StrError(err));
346 PyErr_SetString(PyExc_ImportError, buf);
Jack Jansen4e043731995-02-13 22:42:34 +0000347 return NULL;
348 }
Jack Jansen5d9acb61995-06-14 14:54:25 +0000349 /* Locate the address of the correct init function */
350 err = FindSymbol(connID, Pstring(funcname), &symAddr, &class);
351 if ( err ) {
Guido van Rossumbc2472d1997-04-30 19:07:54 +0000352 sprintf(buf, "%s: %.200s",
353 funcname, PyMac_StrError(err));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000354 PyErr_SetString(PyExc_ImportError, buf);
Jack Jansen5d9acb61995-06-14 14:54:25 +0000355 return NULL;
356 }
357 p = (dl_funcptr)symAddr;
Jack Jansen4e043731995-02-13 22:42:34 +0000358 }
Jack Jansen5d9acb61995-06-14 14:54:25 +0000359#endif /* USE_MAC_DYNAMIC_LOADING */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000360#ifdef USE_SHLIB
361 {
362#ifdef RTLD_NOW
363 /* RTLD_NOW: resolve externals now
364 (i.e. core dump now if some are missing) */
365 void *handle = dlopen(pathname, RTLD_NOW);
366#else
367 void *handle;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000368 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000369 printf("dlopen(\"%s\", %d);\n", pathname, RTLD_LAZY);
370 handle = dlopen(pathname, RTLD_LAZY);
371#endif /* RTLD_NOW */
372 if (handle == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000373 PyErr_SetString(PyExc_ImportError, dlerror());
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000374 return NULL;
375 }
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000376 if (fp != NULL && nhandles < 128)
377 handles[nhandles++].handle = handle;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000378 p = (dl_funcptr) dlsym(handle, funcname);
379 }
380#endif /* USE_SHLIB */
381#ifdef _AIX
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000382 /*
383 -- Invoke load() with L_NOAUTODEFER leaving the imported symbols
384 -- of the shared module unresolved. Thus we have to resolve them
385 -- explicitely with loadbind. The new module is loaded, then we
386 -- resolve its symbols using the list of already loaded modules
387 -- (only those that belong to the python executable). Get these
388 -- with loadquery(L_GETINFO).
389 */
390 {
391 static void *staticmodlistptr = NULL;
392
393 if (!staticmodlistptr)
394 if (aix_getoldmodules(&staticmodlistptr) == -1)
395 return NULL;
396 p = (dl_funcptr) load(pathname, L_NOAUTODEFER, 0);
397 if (p == NULL) {
398 aix_loaderror(pathname);
399 return NULL;
400 }
401 if (aix_bindnewmodule((void *)p, staticmodlistptr) == -1) {
402 aix_loaderror(pathname);
403 return NULL;
404 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000405 }
406#endif /* _AIX */
Guido van Rossum9b38a141996-09-11 23:12:24 +0000407#ifdef MS_WIN32
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000408 {
409 HINSTANCE hDLL;
410 hDLL = LoadLibrary(pathname);
411 if (hDLL==NULL){
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000412 char errBuf[256];
413 unsigned int errorCode;
414
415 /* Get an error string from Win32 error code */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000416 char theInfo[256]; /* Pointer to error text
417 from system */
418 int theLength; /* Length of error text */
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000419
420 errorCode = GetLastError();
421
Guido van Rossum79f25d91997-04-29 20:08:16 +0000422 theLength = FormatMessage(
423 FORMAT_MESSAGE_FROM_SYSTEM, /* flags */
424 NULL, /* message source */
425 errorCode, /* the message (error) ID */
426 0, /* default language environment */
427 (LPTSTR) theInfo, /* the buffer */
428 sizeof(theInfo), /* the buffer size */
429 NULL); /* no additional format args. */
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000430
Guido van Rossum79f25d91997-04-29 20:08:16 +0000431 /* Problem: could not get the error message.
432 This should not happen if called correctly. */
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000433 if (theLength == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000434 sprintf(errBuf,
435 "DLL load failed with error code %d",
436 errorCode);
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000437 } else {
438 int len;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000439 /* For some reason a \r\n
440 is appended to the text */
441 if (theLength >= 2 &&
442 theInfo[theLength-2] == '\r' &&
443 theInfo[theLength-1] == '\n') {
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000444 theLength -= 2;
445 theInfo[theLength] = '\0';
446 }
447 strcpy(errBuf, "DLL load failed: ");
448 len = strlen(errBuf);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000449 strncpy(errBuf+len, theInfo,
450 sizeof(errBuf)-len);
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000451 errBuf[sizeof(errBuf)-1] = '\0';
452 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000453 PyErr_SetString(PyExc_ImportError, errBuf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000454 return NULL;
455 }
456 p = GetProcAddress(hDLL, funcname);
457 }
Guido van Rossum9b38a141996-09-11 23:12:24 +0000458#endif /* MS_WIN32 */
459#ifdef MS_WIN16
Guido van Rossumdadc8241996-05-23 22:51:40 +0000460 {
461 HINSTANCE hDLL;
462 hDLL = LoadLibrary(pathname);
463 if (hDLL < HINSTANCE_ERROR){
464 char errBuf[256];
Guido van Rossum79f25d91997-04-29 20:08:16 +0000465 sprintf(errBuf,
466 "DLL load failed with error code %d", hDLL);
467 PyErr_SetString(PyExc_ImportError, errBuf);
Guido van Rossumdadc8241996-05-23 22:51:40 +0000468 return NULL;
469 }
470 p = GetProcAddress(hDLL, funcname);
471 }
Guido van Rossum9b38a141996-09-11 23:12:24 +0000472#endif /* MS_WIN16 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000473
474#if defined(PYOS_OS2)
475 {
476 APIRET rc;
477 HMODULE hDLL;
478 char failreason[256];
479
480 rc = DosLoadModule(failreason,
481 sizeof(failreason),
482 pathname,
483 &hDLL);
484
485 if (rc != NO_ERROR) {
486 char errBuf[256];
487 sprintf(errBuf,
488 "DLL load failed, rc = %d, problem '%s': %s", rc, failreason);
489 PyErr_SetString(PyExc_ImportError, errBuf);
490 return NULL;
491 }
492
493 rc = DosQueryProcAddr(hDLL, 0L, funcname, &p);
494 if (rc != NO_ERROR)
495 p = NULL; /* Signify Failure to Acquire Entrypoint */
496 }
497#endif /* PYOS_OS2 */
498
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000499#ifdef USE_DL
Guido van Rossum79f25d91997-04-29 20:08:16 +0000500 p = dl_loadmod(Py_GetProgramName(), pathname, funcname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000501#endif /* USE_DL */
502#ifdef USE_RLD
503 {
504 NXStream *errorStream;
505 struct mach_header *new_header;
506 const char *filenames[2];
507 long ret;
508 unsigned long ptr;
509
510 errorStream = NXOpenMemory(NULL, 0, NX_WRITEONLY);
511 filenames[0] = pathname;
512 filenames[1] = NULL;
513 ret = rld_load(errorStream, &new_header,
514 filenames, NULL);
515
516 /* extract the error messages for the exception */
517 if(!ret) {
518 char *streamBuf;
519 int len, maxLen;
520
521 NXPutc(errorStream, (char)0);
522
523 NXGetMemoryBuffer(errorStream,
524 &streamBuf, &len, &maxLen);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000525 PyErr_SetString(PyExc_ImportError, streamBuf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000526 }
527
528 if(ret && rld_lookup(errorStream, funcname, &ptr))
529 p = (dl_funcptr) ptr;
530
531 NXCloseMemory(errorStream, NX_FREEBUFFER);
532
533 if(!ret)
534 return NULL;
535 }
536#endif /* USE_RLD */
537#ifdef hpux
538 {
539 shl_t lib;
540 int flags;
541
Guido van Rossum3afb5951996-12-05 23:15:35 +0000542 flags = BIND_FIRST | BIND_DEFERRED;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000543 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000544 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000545 flags = DYNAMIC_PATH | BIND_FIRST | BIND_IMMEDIATE |
546 BIND_NONFATAL | BIND_VERBOSE;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000547 printf("shl_load %s\n",pathname);
548 }
549 lib = shl_load(pathname, flags, 0);
550 if (lib == NULL)
551 {
552 char buf[256];
Guido van Rossum79f25d91997-04-29 20:08:16 +0000553 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000554 perror(pathname);
555 sprintf(buf, "Failed to load %.200s", pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000556 PyErr_SetString(PyExc_ImportError, buf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000557 return NULL;
558 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000559 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000560 printf("shl_findsym %s\n", funcname);
561 shl_findsym(&lib, funcname, TYPE_UNDEFINED, (void *) &p);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000562 if (p == NULL && Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000563 perror(funcname);
564 }
565#endif /* hpux */
Guido van Rossum644a12b1997-04-09 19:24:53 +0000566#ifdef USE_SHLIB
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000567 got_it:
Guido van Rossum644a12b1997-04-09 19:24:53 +0000568#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000569 if (p == NULL) {
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000570 PyErr_Format(PyExc_ImportError,
571 "dynamic module does not define init function (%s)",
572 funcname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000573 return NULL;
574 }
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000575 _Py_PackageContext = packagecontext;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000576 (*p)();
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000577 _Py_PackageContext = NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000578 if (PyErr_Occurred())
579 return NULL;
580 if (_PyImport_FixupExtension(name, pathname) == NULL)
581 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000582
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000583 m = PyDict_GetItemString(PyImport_GetModuleDict(), name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000584 if (m == NULL) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000585 PyErr_SetString(PyExc_SystemError,
586 "dynamic module not initialized properly");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000587 return NULL;
588 }
Guido van Rossum1e612491996-08-19 22:12:10 +0000589 /* Remember the filename as the __file__ attribute */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000590 d = PyModule_GetDict(m);
591 s = PyString_FromString(pathname);
592 if (s == NULL || PyDict_SetItemString(d, "__file__", s) != 0)
593 PyErr_Clear(); /* Not important enough to report */
594 Py_XDECREF(s);
595 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000596 fprintf(stderr,
597 "import %s # dynamically loaded from %s\n",
598 name, pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000599 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000600 return m;
601#endif /* DYNAMIC_LINK */
602}
603
604
605#ifdef _AIX
606
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000607#include <ctype.h> /* for isdigit() */
608#include <errno.h> /* for global errno */
609#include <string.h> /* for strerror() */
610#include <stdlib.h> /* for malloc(), free() */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000611
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000612typedef struct Module {
613 struct Module *next;
614 void *entry;
615} Module, *ModulePtr;
616
617static int
618aix_getoldmodules(modlistptr)
619 void **modlistptr;
620{
621 register ModulePtr modptr, prevmodptr;
622 register struct ld_info *ldiptr;
623 register char *ldibuf;
624 register int errflag, bufsize = 1024;
625 register unsigned int offset;
626
627 /*
628 -- Get the list of loaded modules into ld_info structures.
629 */
630 if ((ldibuf = malloc(bufsize)) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000631 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000632 return -1;
633 }
634 while ((errflag = loadquery(L_GETINFO, ldibuf, bufsize)) == -1
635 && errno == ENOMEM) {
636 free(ldibuf);
637 bufsize += 1024;
638 if ((ldibuf = malloc(bufsize)) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000639 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000640 return -1;
641 }
642 }
643 if (errflag == -1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000644 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000645 return -1;
646 }
647 /*
648 -- Make the modules list from the ld_info structures.
649 */
650 ldiptr = (struct ld_info *)ldibuf;
651 prevmodptr = NULL;
652 do {
Guido van Rossum3b31cd21997-10-10 17:40:00 +0000653 if (strstr(ldiptr->ldinfo_filename, "python") == NULL) {
654 /*
655 -- Extract only the modules containing "python" as a
656 -- substring, like the "python[version]" executable or
657 -- "libpython[version].a" in case python is embedded.
658 */
659 offset = (unsigned int)ldiptr->ldinfo_next;
660 ldiptr = (struct ld_info *)((unsigned int)
661 ldiptr + offset);
662 continue;
663 }
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000664 if ((modptr = (ModulePtr)malloc(sizeof(Module))) == 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 while (*modlistptr) {
667 modptr = (ModulePtr)*modlistptr;
668 *modlistptr = (void *)modptr->next;
669 free(modptr);
670 }
671 return -1;
672 }
673 modptr->entry = ldiptr->ldinfo_dataorg;
674 modptr->next = NULL;
675 if (prevmodptr == NULL)
676 *modlistptr = (void *)modptr;
677 else
678 prevmodptr->next = modptr;
679 prevmodptr = modptr;
680 offset = (unsigned int)ldiptr->ldinfo_next;
681 ldiptr = (struct ld_info *)((unsigned int)ldiptr + offset);
682 } while (offset);
683 free(ldibuf);
684 return 0;
685}
686
687static int
688aix_bindnewmodule(newmoduleptr, modlistptr)
689 void *newmoduleptr;
690 void *modlistptr;
691{
692 register ModulePtr modptr;
693
694 /*
695 -- Bind the new module with the list of loaded modules.
696 */
697 for (modptr = (ModulePtr)modlistptr; modptr; modptr = modptr->next)
698 if (loadbind(0, modptr->entry, newmoduleptr) != 0)
699 return -1;
700 return 0;
701}
702
703static void
704aix_loaderror(pathname)
705 char *pathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000706{
707
Guido van Rossum236f62d1996-06-26 21:07:08 +0000708 char *message[1024], errbuf[1024];
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000709 register int i,j;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000710
711 struct errtab {
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000712 int errNo;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000713 char *errstr;
714 } load_errtab[] = {
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000715 {L_ERROR_TOOMANY, "too many errors, rest skipped."},
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000716 {L_ERROR_NOLIB, "can't load library:"},
717 {L_ERROR_UNDEF, "can't find symbol in library:"},
718 {L_ERROR_RLDBAD,
719 "RLD index out of range or bad relocation type:"},
720 {L_ERROR_FORMAT, "not a valid, executable xcoff file:"},
721 {L_ERROR_MEMBER,
722 "file not an archive or does not contain requested member:"},
723 {L_ERROR_TYPE, "symbol table mismatch:"},
Guido van Rossum236f62d1996-06-26 21:07:08 +0000724 {L_ERROR_ALIGN, "text alignment in file is wrong."},
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000725 {L_ERROR_SYSTEM, "System error:"},
726 {L_ERROR_ERRNO, NULL}
727 };
728
729#define LOAD_ERRTAB_LEN (sizeof(load_errtab)/sizeof(load_errtab[0]))
730#define ERRBUF_APPEND(s) strncat(errbuf, s, sizeof(errbuf)-strlen(errbuf)-1)
731
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000732 sprintf(errbuf, "from module %.200s ", pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000733
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000734 if (!loadquery(L_GETMESSAGES, &message[0], sizeof(message))) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000735 ERRBUF_APPEND(strerror(errno));
Guido van Rossum236f62d1996-06-26 21:07:08 +0000736 ERRBUF_APPEND("\n");
737 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000738 for(i = 0; message[i] && *message[i]; i++) {
739 int nerr = atoi(message[i]);
740 for (j=0; j<LOAD_ERRTAB_LEN ; j++) {
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000741 if (nerr == load_errtab[j].errNo && load_errtab[j].errstr)
Guido van Rossum236f62d1996-06-26 21:07:08 +0000742 ERRBUF_APPEND(load_errtab[j].errstr);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000743 }
744 while (isdigit(*message[i])) message[i]++ ;
745 ERRBUF_APPEND(message[i]);
746 ERRBUF_APPEND("\n");
747 }
748 errbuf[strlen(errbuf)-1] = '\0'; /* trim off last newline */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000749 PyErr_SetString(PyExc_ImportError, errbuf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000750 return;
751}
752
753#endif /* _AIX */