blob: 157257ff9ec73649c2565ba352a59893eef1852f [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 Rossum15af20a1998-01-19 22:03:52 +000056 __NetBSD__ -- NetBSD shared libraries
57 (assuming dlerror() was introduced between 1.2 and 1.3)
Guido van Rossum25e85291996-02-25 05:02:29 +000058 __FreeBSD__ -- FreeBSD shared libraries
Guido van Rossum1ae940a1995-01-02 19:04:15 +000059
60 (The other WITH_* symbols are used only once, to set the
61 appropriate symbols.)
62*/
63
64/* Configure dynamic linking */
65
Guido van Rossumff4af061996-01-12 01:17:50 +000066#ifdef __hpux
Guido van Rossum1e612491996-08-19 22:12:10 +000067#ifndef hpux
Guido van Rossumff4af061996-01-12 01:17:50 +000068#define hpux
69#endif
Guido van Rossum1e612491996-08-19 22:12:10 +000070#endif
Guido van Rossumff4af061996-01-12 01:17:50 +000071
Guido van Rossum1ae940a1995-01-02 19:04:15 +000072#ifdef hpux
73#define DYNAMIC_LINK
74#include <errno.h>
75typedef void (*dl_funcptr)();
76#define _DL_FUNCPTR_DEFINED 1
77#define SHORT_EXT ".sl"
78#define LONG_EXT "module.sl"
79#endif
80
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000081#if defined(PYOS_OS2)
82#define DYNAMIC_LINK
83#define INCL_DOSERRORS
84#define INCL_DOSMODULEMGR
85#include <os2.h>
86typedef int (* APIENTRY dl_funcptr)();
87#define _DL_FUNCPTR_DEFINED 1
88#define SHORT_EXT ".pyd"
89#define LONG_EXT ".dll"
90#endif
91
Guido van Rossum15af20a1998-01-19 22:03:52 +000092#ifdef HAVE_SYS_PARAM_H
93#include <sys/param.h>
94#endif
95
96#if defined(__NetBSD__) && (NetBSD < 199712)
Guido van Rossum46c76a61995-01-20 16:53:54 +000097#define DYNAMIC_LINK
98#define USE_SHLIB
99
100#define dlerror() "error in dynamic linking"
101#endif
102
Guido van Rossum9b38a141996-09-11 23:12:24 +0000103#ifdef MS_WINDOWS /* i.e. MS_WIN32 or MS_WIN16 */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000104#define DYNAMIC_LINK
105#include <windows.h>
106typedef FARPROC dl_funcptr;
107#define _DL_FUNCPTR_DEFINED
Guido van Rossum5fb1da71995-01-07 12:36:02 +0000108#define SHORT_EXT ".pyd"
Guido van Rossume71a9471996-04-09 02:39:15 +0000109#define LONG_EXT ".dll"
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000110#endif
111
Guido van Rossum75f288d1995-06-14 22:07:26 +0000112#ifdef NeXT
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000113#define DYNAMIC_LINK
114#define USE_RLD
Guido van Rossum54dec591997-08-16 14:38:09 +0000115#define SHORT_EXT ".so"
116#define LONG_EXT "module.so"
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000117#endif
118
119#ifdef WITH_SGI_DL
120#define DYNAMIC_LINK
121#define USE_DL
122#endif
123
124#ifdef WITH_DL_DLD
125#define DYNAMIC_LINK
126#define USE_DL
127#endif
128
Jack Jansen5d9acb61995-06-14 14:54:25 +0000129#ifdef USE_MAC_DYNAMIC_LOADING
Jack Jansen4e043731995-02-13 22:42:34 +0000130#define DYNAMIC_LINK
Guido van Rossum6a75d261995-02-18 14:51:15 +0000131#define SHORT_EXT ".slb"
Guido van Rossum1e612491996-08-19 22:12:10 +0000132#ifdef __CFM68K__
133#define LONG_EXT ".CFM68K.slb"
134#else
135#define LONG_EXT ".ppc.slb"
136#endif
Jack Jansen4e043731995-02-13 22:42:34 +0000137#ifndef _DL_FUNCPTR_DEFINED
138typedef void (*dl_funcptr)();
139#endif
140#endif
141
Guido van Rossum504f4a91996-08-20 19:59:07 +0000142#if !defined(DYNAMIC_LINK) && (defined(HAVE_DLOPEN) || defined(M_UNIX))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000143#define DYNAMIC_LINK
144#define USE_SHLIB
145#endif
146
147#ifdef _AIX
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000148#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 +0000149#define DYNAMIC_LINK
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000150#define SHORT_EXT ".so"
151#define LONG_EXT "module.so"
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000152#include <sys/ldr.h>
153typedef void (*dl_funcptr)();
154#define _DL_FUNCPTR_DEFINED
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000155static int aix_getoldmodules(void **);
156static int aix_bindnewmodule(void *, void *);
157static void aix_loaderror(char *);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000158#endif
159
160#ifdef DYNAMIC_LINK
161
162#ifdef USE_SHLIB
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000163#include <sys/types.h>
164#include <sys/stat.h>
Guido van Rossum15af20a1998-01-19 22:03:52 +0000165#if defined(__NetBSD__) && (NetBSD < 199712)
Guido van Rossum46c76a61995-01-20 16:53:54 +0000166#include <nlist.h>
167#include <link.h>
168#else
Guido van Rossum504f4a91996-08-20 19:59:07 +0000169#ifdef HAVE_DLFCN_H
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000170#include <dlfcn.h>
Guido van Rossum46c76a61995-01-20 16:53:54 +0000171#endif
Guido van Rossum504f4a91996-08-20 19:59:07 +0000172#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000173#ifndef _DL_FUNCPTR_DEFINED
174typedef void (*dl_funcptr)();
175#endif
176#ifndef RTLD_LAZY
177#define RTLD_LAZY 1
178#endif
Guido van Rossum08052c71997-12-02 20:43:18 +0000179#ifndef RTLD_GLOBAL
180#define RTLD_GLOBAL 0
181#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000182#define SHORT_EXT ".so"
183#define LONG_EXT "module.so"
184#endif /* USE_SHLIB */
185
186#if defined(USE_DL) || defined(hpux)
187#include "dl.h"
188#endif
189
Jack Jansen5d9acb61995-06-14 14:54:25 +0000190#ifdef USE_MAC_DYNAMIC_LOADING
Jack Jansen0a72e8d1995-10-23 13:54:01 +0000191#include <Aliases.h>
Jack Jansen4e043731995-02-13 22:42:34 +0000192#include <CodeFragments.h>
Guido van Rossum79f25d91997-04-29 20:08:16 +0000193#ifdef SYMANTEC__CFM68K__ /* Really an older version of Universal Headers */
Guido van Rossum6a75d261995-02-18 14:51:15 +0000194#define CFragConnectionID ConnectionID
195#define kLoadCFrag 0x01
196#endif
Jack Jansen4e043731995-02-13 22:42:34 +0000197#include <Files.h>
198#include "macdefs.h"
199#include "macglue.h"
200#endif
201
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000202#ifdef USE_RLD
203#include <mach-o/rld.h>
204#define FUNCNAME_PATTERN "_init%.200s"
205#ifndef _DL_FUNCPTR_DEFINED
206typedef void (*dl_funcptr)();
207#endif
208#endif /* USE_RLD */
209
Guido van Rossum79f25d91997-04-29 20:08:16 +0000210extern char *Py_GetProgramName();
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000211
212#ifndef FUNCNAME_PATTERN
Guido van Rossum25e85291996-02-25 05:02:29 +0000213#if defined(__hp9000s300) || defined(__NetBSD__) || defined(__FreeBSD__) || defined(__BORLANDC__)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000214#define FUNCNAME_PATTERN "_init%.200s"
215#else
216#define FUNCNAME_PATTERN "init%.200s"
217#endif
218#endif
219
220#if !defined(SHORT_EXT) && !defined(LONG_EXT)
221#define SHORT_EXT ".o"
222#define LONG_EXT "module.o"
223#endif /* !SHORT_EXT && !LONG_EXT */
224
225#endif /* DYNAMIC_LINK */
226
Guido van Rossum79f25d91997-04-29 20:08:16 +0000227struct filedescr _PyImport_Filetab[] = {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000228#ifdef SHORT_EXT
229 {SHORT_EXT, "rb", C_EXTENSION},
230#endif /* !SHORT_EXT */
231#ifdef LONG_EXT
232 {LONG_EXT, "rb", C_EXTENSION},
233#endif /* !LONG_EXT */
234 {".py", "r", PY_SOURCE},
235 {".pyc", "rb", PY_COMPILED},
236 {0, 0}
237};
238
Guido van Rossum38234201996-07-31 17:55:19 +0000239#ifdef NO_DYNAMIC_LINK
240#undef DYNAMIC_LINK
241#endif
242
Guido van Rossum79f25d91997-04-29 20:08:16 +0000243PyObject *
244_PyImport_LoadDynamicModule(name, pathname, fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000245 char *name;
246 char *pathname;
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000247 FILE *fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000248{
249#ifndef DYNAMIC_LINK
Guido van Rossum79f25d91997-04-29 20:08:16 +0000250 PyErr_SetString(PyExc_ImportError,
251 "dynamically linked modules not supported");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000252 return NULL;
253#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000254 PyObject *m, *d, *s;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000255 char funcname[258];
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000256 char *lastdot, *shortname, *packagecontext;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000257 dl_funcptr p = NULL;
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000258#ifdef USE_SHLIB
259 static struct {
260 dev_t dev;
261 ino_t ino;
262 void *handle;
263 } handles[128];
264 static int nhandles = 0;
Guido van Rossum0bbf2531996-08-09 20:55:05 +0000265 char pathbuf[260];
266 if (strchr(pathname, '/') == NULL) {
267 /* Prefix bare filename with "./" */
268 sprintf(pathbuf, "./%-.255s", pathname);
269 pathname = pathbuf;
270 }
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000271#endif
Guido van Rossum25ce5661997-08-02 03:10:38 +0000272 if ((m = _PyImport_FindExtension(name, pathname)) != NULL) {
273 Py_INCREF(m);
274 return m;
275 }
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000276 lastdot = strrchr(name, '.');
277 if (lastdot == NULL) {
278 packagecontext = NULL;
279 shortname = name;
280 }
281 else {
282 packagecontext = name;
283 shortname = lastdot+1;
284 }
285 sprintf(funcname, FUNCNAME_PATTERN, shortname);
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000286#ifdef USE_SHLIB
287 if (fp != NULL) {
288 int i;
289 struct stat statb;
290 fstat(fileno(fp), &statb);
291 for (i = 0; i < nhandles; i++) {
292 if (statb.st_dev == handles[i].dev &&
293 statb.st_ino == handles[i].ino) {
294 p = (dl_funcptr) dlsym(handles[i].handle,
295 funcname);
296 goto got_it;
297 }
298 }
299 if (nhandles < 128) {
300 handles[nhandles].dev = statb.st_dev;
301 handles[nhandles].ino = statb.st_ino;
302 }
303 }
304#endif /* USE_SHLIB */
Jack Jansen5d9acb61995-06-14 14:54:25 +0000305#ifdef USE_MAC_DYNAMIC_LOADING
306 /*
Guido van Rossum79f25d91997-04-29 20:08:16 +0000307 ** Dynamic loading of CFM shared libraries on the Mac. The
308 ** code has become more convoluted than it was, because we
309 ** want to be able to put multiple modules in a single
310 ** file. For this reason, we have to determine the fragment
311 ** name, and we cannot use the library entry point but we have
312 ** to locate the correct init routine "by hand".
Jack Jansen5d9acb61995-06-14 14:54:25 +0000313 */
Jack Jansen4e043731995-02-13 22:42:34 +0000314 {
315 FSSpec libspec;
316 CFragConnectionID connID;
Guido van Rossum6a75d261995-02-18 14:51:15 +0000317 Ptr mainAddr;
318 Str255 errMessage;
319 OSErr err;
Jack Jansen5d9acb61995-06-14 14:54:25 +0000320 Boolean isfolder, didsomething;
321 char buf[512];
322 Str63 fragname;
323 Ptr symAddr;
324 CFragSymbolClass class;
Jack Jansen4e043731995-02-13 22:42:34 +0000325
Jack Jansen5d9acb61995-06-14 14:54:25 +0000326 /* First resolve any aliases to find the real file */
Jack Jansen4e043731995-02-13 22:42:34 +0000327 (void)FSMakeFSSpec(0, 0, Pstring(pathname), &libspec);
Jack Jansen5d9acb61995-06-14 14:54:25 +0000328 err = ResolveAliasFile(&libspec, 1, &isfolder, &didsomething);
329 if ( err ) {
Guido van Rossumbc2472d1997-04-30 19:07:54 +0000330 sprintf(buf, "%.255s: %.200s",
331 pathname, PyMac_StrError(err));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000332 PyErr_SetString(PyExc_ImportError, buf);
Jack Jansen5d9acb61995-06-14 14:54:25 +0000333 return NULL;
334 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000335 /* Next, determine the fragment name,
336 by stripping '.slb' and 'module' */
Jack Jansen5d9acb61995-06-14 14:54:25 +0000337 memcpy(fragname+1, libspec.name+1, libspec.name[0]);
338 fragname[0] = libspec.name[0];
Guido van Rossum79f25d91997-04-29 20:08:16 +0000339 if( strncmp((char *)(fragname+1+fragname[0]-4),
340 ".slb", 4) == 0 )
Jack Jansen5d9acb61995-06-14 14:54:25 +0000341 fragname[0] -= 4;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000342 if ( strncmp((char *)(fragname+1+fragname[0]-6),
343 "module", 6) == 0 )
Jack Jansen5d9acb61995-06-14 14:54:25 +0000344 fragname[0] -= 6;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000345 /* Load the fragment
346 (or return the connID if it is already loaded */
Jack Jansen5d9acb61995-06-14 14:54:25 +0000347 err = GetDiskFragment(&libspec, 0, 0, fragname,
Guido van Rossum6a75d261995-02-18 14:51:15 +0000348 kLoadCFrag, &connID, &mainAddr,
349 errMessage);
Jack Jansen4e043731995-02-13 22:42:34 +0000350 if ( err ) {
Guido van Rossumbc2472d1997-04-30 19:07:54 +0000351 sprintf(buf, "%.*s: %.200s",
352 errMessage[0], errMessage+1,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000353 PyMac_StrError(err));
354 PyErr_SetString(PyExc_ImportError, buf);
Jack Jansen4e043731995-02-13 22:42:34 +0000355 return NULL;
356 }
Jack Jansen5d9acb61995-06-14 14:54:25 +0000357 /* Locate the address of the correct init function */
358 err = FindSymbol(connID, Pstring(funcname), &symAddr, &class);
359 if ( err ) {
Guido van Rossumbc2472d1997-04-30 19:07:54 +0000360 sprintf(buf, "%s: %.200s",
361 funcname, PyMac_StrError(err));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000362 PyErr_SetString(PyExc_ImportError, buf);
Jack Jansen5d9acb61995-06-14 14:54:25 +0000363 return NULL;
364 }
365 p = (dl_funcptr)symAddr;
Jack Jansen4e043731995-02-13 22:42:34 +0000366 }
Jack Jansen5d9acb61995-06-14 14:54:25 +0000367#endif /* USE_MAC_DYNAMIC_LOADING */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000368#ifdef USE_SHLIB
369 {
370#ifdef RTLD_NOW
371 /* RTLD_NOW: resolve externals now
372 (i.e. core dump now if some are missing) */
Guido van Rossum08052c71997-12-02 20:43:18 +0000373 void *handle = dlopen(pathname, RTLD_NOW | RTLD_GLOBAL);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000374#else
375 void *handle;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000376 if (Py_VerboseFlag)
Guido van Rossum08052c71997-12-02 20:43:18 +0000377 printf("dlopen(\"%s\", %d);\n", pathname,
378 RTLD_LAZY | RTLD_GLOBAL);
379 handle = dlopen(pathname, RTLD_LAZY | RTLD_GLOBAL);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000380#endif /* RTLD_NOW */
381 if (handle == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000382 PyErr_SetString(PyExc_ImportError, dlerror());
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000383 return NULL;
384 }
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000385 if (fp != NULL && nhandles < 128)
386 handles[nhandles++].handle = handle;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000387 p = (dl_funcptr) dlsym(handle, funcname);
388 }
389#endif /* USE_SHLIB */
390#ifdef _AIX
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000391 /*
392 -- Invoke load() with L_NOAUTODEFER leaving the imported symbols
393 -- of the shared module unresolved. Thus we have to resolve them
394 -- explicitely with loadbind. The new module is loaded, then we
395 -- resolve its symbols using the list of already loaded modules
396 -- (only those that belong to the python executable). Get these
397 -- with loadquery(L_GETINFO).
398 */
399 {
400 static void *staticmodlistptr = NULL;
401
402 if (!staticmodlistptr)
403 if (aix_getoldmodules(&staticmodlistptr) == -1)
404 return NULL;
405 p = (dl_funcptr) load(pathname, L_NOAUTODEFER, 0);
406 if (p == NULL) {
407 aix_loaderror(pathname);
408 return NULL;
409 }
410 if (aix_bindnewmodule((void *)p, staticmodlistptr) == -1) {
411 aix_loaderror(pathname);
412 return NULL;
413 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000414 }
415#endif /* _AIX */
Guido van Rossum9b38a141996-09-11 23:12:24 +0000416#ifdef MS_WIN32
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000417 {
418 HINSTANCE hDLL;
419 hDLL = LoadLibrary(pathname);
420 if (hDLL==NULL){
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000421 char errBuf[256];
422 unsigned int errorCode;
423
424 /* Get an error string from Win32 error code */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000425 char theInfo[256]; /* Pointer to error text
426 from system */
427 int theLength; /* Length of error text */
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000428
429 errorCode = GetLastError();
430
Guido van Rossum79f25d91997-04-29 20:08:16 +0000431 theLength = FormatMessage(
432 FORMAT_MESSAGE_FROM_SYSTEM, /* flags */
433 NULL, /* message source */
434 errorCode, /* the message (error) ID */
435 0, /* default language environment */
436 (LPTSTR) theInfo, /* the buffer */
437 sizeof(theInfo), /* the buffer size */
438 NULL); /* no additional format args. */
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000439
Guido van Rossum79f25d91997-04-29 20:08:16 +0000440 /* Problem: could not get the error message.
441 This should not happen if called correctly. */
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000442 if (theLength == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000443 sprintf(errBuf,
444 "DLL load failed with error code %d",
445 errorCode);
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000446 } else {
447 int len;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000448 /* For some reason a \r\n
449 is appended to the text */
450 if (theLength >= 2 &&
451 theInfo[theLength-2] == '\r' &&
452 theInfo[theLength-1] == '\n') {
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000453 theLength -= 2;
454 theInfo[theLength] = '\0';
455 }
456 strcpy(errBuf, "DLL load failed: ");
457 len = strlen(errBuf);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000458 strncpy(errBuf+len, theInfo,
459 sizeof(errBuf)-len);
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000460 errBuf[sizeof(errBuf)-1] = '\0';
461 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000462 PyErr_SetString(PyExc_ImportError, errBuf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000463 return NULL;
464 }
465 p = GetProcAddress(hDLL, funcname);
466 }
Guido van Rossum9b38a141996-09-11 23:12:24 +0000467#endif /* MS_WIN32 */
468#ifdef MS_WIN16
Guido van Rossumdadc8241996-05-23 22:51:40 +0000469 {
470 HINSTANCE hDLL;
471 hDLL = LoadLibrary(pathname);
472 if (hDLL < HINSTANCE_ERROR){
473 char errBuf[256];
Guido van Rossum79f25d91997-04-29 20:08:16 +0000474 sprintf(errBuf,
475 "DLL load failed with error code %d", hDLL);
476 PyErr_SetString(PyExc_ImportError, errBuf);
Guido van Rossumdadc8241996-05-23 22:51:40 +0000477 return NULL;
478 }
479 p = GetProcAddress(hDLL, funcname);
480 }
Guido van Rossum9b38a141996-09-11 23:12:24 +0000481#endif /* MS_WIN16 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000482
483#if defined(PYOS_OS2)
484 {
485 APIRET rc;
486 HMODULE hDLL;
487 char failreason[256];
488
489 rc = DosLoadModule(failreason,
490 sizeof(failreason),
491 pathname,
492 &hDLL);
493
494 if (rc != NO_ERROR) {
495 char errBuf[256];
496 sprintf(errBuf,
497 "DLL load failed, rc = %d, problem '%s': %s", rc, failreason);
498 PyErr_SetString(PyExc_ImportError, errBuf);
499 return NULL;
500 }
501
502 rc = DosQueryProcAddr(hDLL, 0L, funcname, &p);
503 if (rc != NO_ERROR)
504 p = NULL; /* Signify Failure to Acquire Entrypoint */
505 }
506#endif /* PYOS_OS2 */
507
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000508#ifdef USE_DL
Guido van Rossum79f25d91997-04-29 20:08:16 +0000509 p = dl_loadmod(Py_GetProgramName(), pathname, funcname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000510#endif /* USE_DL */
511#ifdef USE_RLD
512 {
513 NXStream *errorStream;
514 struct mach_header *new_header;
515 const char *filenames[2];
516 long ret;
517 unsigned long ptr;
518
519 errorStream = NXOpenMemory(NULL, 0, NX_WRITEONLY);
520 filenames[0] = pathname;
521 filenames[1] = NULL;
522 ret = rld_load(errorStream, &new_header,
523 filenames, NULL);
524
525 /* extract the error messages for the exception */
526 if(!ret) {
527 char *streamBuf;
528 int len, maxLen;
529
530 NXPutc(errorStream, (char)0);
531
532 NXGetMemoryBuffer(errorStream,
533 &streamBuf, &len, &maxLen);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000534 PyErr_SetString(PyExc_ImportError, streamBuf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000535 }
536
537 if(ret && rld_lookup(errorStream, funcname, &ptr))
538 p = (dl_funcptr) ptr;
539
540 NXCloseMemory(errorStream, NX_FREEBUFFER);
541
542 if(!ret)
543 return NULL;
544 }
545#endif /* USE_RLD */
546#ifdef hpux
547 {
548 shl_t lib;
549 int flags;
550
Guido van Rossum3afb5951996-12-05 23:15:35 +0000551 flags = BIND_FIRST | BIND_DEFERRED;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000552 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000553 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000554 flags = DYNAMIC_PATH | BIND_FIRST | BIND_IMMEDIATE |
555 BIND_NONFATAL | BIND_VERBOSE;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000556 printf("shl_load %s\n",pathname);
557 }
558 lib = shl_load(pathname, flags, 0);
559 if (lib == NULL)
560 {
561 char buf[256];
Guido van Rossum79f25d91997-04-29 20:08:16 +0000562 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000563 perror(pathname);
564 sprintf(buf, "Failed to load %.200s", pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000565 PyErr_SetString(PyExc_ImportError, buf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000566 return NULL;
567 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000568 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000569 printf("shl_findsym %s\n", funcname);
570 shl_findsym(&lib, funcname, TYPE_UNDEFINED, (void *) &p);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000571 if (p == NULL && Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000572 perror(funcname);
573 }
574#endif /* hpux */
Guido van Rossum644a12b1997-04-09 19:24:53 +0000575#ifdef USE_SHLIB
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000576 got_it:
Guido van Rossum644a12b1997-04-09 19:24:53 +0000577#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000578 if (p == NULL) {
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000579 PyErr_Format(PyExc_ImportError,
Guido van Rossum42e8e5d1998-01-19 22:23:08 +0000580 "dynamic module does not define init function (%.200s)",
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000581 funcname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000582 return NULL;
583 }
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000584 _Py_PackageContext = packagecontext;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000585 (*p)();
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000586 _Py_PackageContext = NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000587 if (PyErr_Occurred())
588 return NULL;
589 if (_PyImport_FixupExtension(name, pathname) == NULL)
590 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000591
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000592 m = PyDict_GetItemString(PyImport_GetModuleDict(), name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000593 if (m == NULL) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000594 PyErr_SetString(PyExc_SystemError,
595 "dynamic module not initialized properly");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000596 return NULL;
597 }
Guido van Rossum1e612491996-08-19 22:12:10 +0000598 /* Remember the filename as the __file__ attribute */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000599 d = PyModule_GetDict(m);
600 s = PyString_FromString(pathname);
601 if (s == NULL || PyDict_SetItemString(d, "__file__", s) != 0)
602 PyErr_Clear(); /* Not important enough to report */
603 Py_XDECREF(s);
604 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000605 fprintf(stderr,
606 "import %s # dynamically loaded from %s\n",
607 name, pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000608 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000609 return m;
610#endif /* DYNAMIC_LINK */
611}
612
613
614#ifdef _AIX
615
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000616#include <ctype.h> /* for isdigit() */
617#include <errno.h> /* for global errno */
618#include <string.h> /* for strerror() */
619#include <stdlib.h> /* for malloc(), free() */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000620
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000621typedef struct Module {
622 struct Module *next;
623 void *entry;
624} Module, *ModulePtr;
625
626static int
627aix_getoldmodules(modlistptr)
628 void **modlistptr;
629{
630 register ModulePtr modptr, prevmodptr;
631 register struct ld_info *ldiptr;
632 register char *ldibuf;
633 register int errflag, bufsize = 1024;
634 register unsigned int offset;
635
636 /*
637 -- Get the list of loaded modules into ld_info structures.
638 */
639 if ((ldibuf = malloc(bufsize)) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000640 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000641 return -1;
642 }
643 while ((errflag = loadquery(L_GETINFO, ldibuf, bufsize)) == -1
644 && errno == ENOMEM) {
645 free(ldibuf);
646 bufsize += 1024;
647 if ((ldibuf = malloc(bufsize)) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000648 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000649 return -1;
650 }
651 }
652 if (errflag == -1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000653 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000654 return -1;
655 }
656 /*
657 -- Make the modules list from the ld_info structures.
658 */
659 ldiptr = (struct ld_info *)ldibuf;
660 prevmodptr = NULL;
661 do {
Guido van Rossum3b31cd21997-10-10 17:40:00 +0000662 if (strstr(ldiptr->ldinfo_filename, "python") == NULL) {
663 /*
664 -- Extract only the modules containing "python" as a
665 -- substring, like the "python[version]" executable or
666 -- "libpython[version].a" in case python is embedded.
667 */
668 offset = (unsigned int)ldiptr->ldinfo_next;
669 ldiptr = (struct ld_info *)((unsigned int)
670 ldiptr + offset);
671 continue;
672 }
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000673 if ((modptr = (ModulePtr)malloc(sizeof(Module))) == 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 while (*modlistptr) {
676 modptr = (ModulePtr)*modlistptr;
677 *modlistptr = (void *)modptr->next;
678 free(modptr);
679 }
680 return -1;
681 }
682 modptr->entry = ldiptr->ldinfo_dataorg;
683 modptr->next = NULL;
684 if (prevmodptr == NULL)
685 *modlistptr = (void *)modptr;
686 else
687 prevmodptr->next = modptr;
688 prevmodptr = modptr;
689 offset = (unsigned int)ldiptr->ldinfo_next;
690 ldiptr = (struct ld_info *)((unsigned int)ldiptr + offset);
691 } while (offset);
692 free(ldibuf);
693 return 0;
694}
695
696static int
697aix_bindnewmodule(newmoduleptr, modlistptr)
698 void *newmoduleptr;
699 void *modlistptr;
700{
701 register ModulePtr modptr;
702
703 /*
704 -- Bind the new module with the list of loaded modules.
705 */
706 for (modptr = (ModulePtr)modlistptr; modptr; modptr = modptr->next)
707 if (loadbind(0, modptr->entry, newmoduleptr) != 0)
708 return -1;
709 return 0;
710}
711
712static void
713aix_loaderror(pathname)
714 char *pathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000715{
716
Guido van Rossum236f62d1996-06-26 21:07:08 +0000717 char *message[1024], errbuf[1024];
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000718 register int i,j;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000719
720 struct errtab {
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000721 int errNo;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000722 char *errstr;
723 } load_errtab[] = {
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000724 {L_ERROR_TOOMANY, "too many errors, rest skipped."},
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000725 {L_ERROR_NOLIB, "can't load library:"},
726 {L_ERROR_UNDEF, "can't find symbol in library:"},
727 {L_ERROR_RLDBAD,
728 "RLD index out of range or bad relocation type:"},
729 {L_ERROR_FORMAT, "not a valid, executable xcoff file:"},
730 {L_ERROR_MEMBER,
731 "file not an archive or does not contain requested member:"},
732 {L_ERROR_TYPE, "symbol table mismatch:"},
Guido van Rossum236f62d1996-06-26 21:07:08 +0000733 {L_ERROR_ALIGN, "text alignment in file is wrong."},
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000734 {L_ERROR_SYSTEM, "System error:"},
735 {L_ERROR_ERRNO, NULL}
736 };
737
738#define LOAD_ERRTAB_LEN (sizeof(load_errtab)/sizeof(load_errtab[0]))
739#define ERRBUF_APPEND(s) strncat(errbuf, s, sizeof(errbuf)-strlen(errbuf)-1)
740
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000741 sprintf(errbuf, "from module %.200s ", pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000742
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000743 if (!loadquery(L_GETMESSAGES, &message[0], sizeof(message))) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000744 ERRBUF_APPEND(strerror(errno));
Guido van Rossum236f62d1996-06-26 21:07:08 +0000745 ERRBUF_APPEND("\n");
746 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000747 for(i = 0; message[i] && *message[i]; i++) {
748 int nerr = atoi(message[i]);
749 for (j=0; j<LOAD_ERRTAB_LEN ; j++) {
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000750 if (nerr == load_errtab[j].errNo && load_errtab[j].errstr)
Guido van Rossum236f62d1996-06-26 21:07:08 +0000751 ERRBUF_APPEND(load_errtab[j].errstr);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000752 }
753 while (isdigit(*message[i])) message[i]++ ;
754 ERRBUF_APPEND(message[i]);
755 ERRBUF_APPEND("\n");
756 }
757 errbuf[strlen(errbuf)-1] = '\0'; /* trim off last newline */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000758 PyErr_SetString(PyExc_ImportError, errbuf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000759 return;
760}
761
762#endif /* _AIX */