blob: 3f715dec83dd5185e7eb09e67574ed9ed2829bea [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 Rossum1ae940a1995-01-02 19:04:15 +000050 _DL_FUNCPTR_DEFINED -- if the typedef dl_funcptr has been defined
Jack Jansen5d9acb61995-06-14 14:54:25 +000051 USE_MAC_DYNAMIC_LOADING -- Mac CFM shared libraries
Guido van Rossum1ae940a1995-01-02 19:04:15 +000052 SHORT_EXT -- short extension for dynamic module, e.g. ".so"
53 LONG_EXT -- long extension, e.g. "module.so"
54 hpux -- HP-UX Dynamic Linking - defined by the compiler
Guido van Rossum46c76a61995-01-20 16:53:54 +000055 __NetBSD__ -- NetBSD shared libraries (not quite SVR4 compatible)
Guido van Rossum25e85291996-02-25 05:02:29 +000056 __FreeBSD__ -- FreeBSD shared libraries
Guido van Rossum1ae940a1995-01-02 19:04:15 +000057
58 (The other WITH_* symbols are used only once, to set the
59 appropriate symbols.)
60*/
61
62/* Configure dynamic linking */
63
Guido van Rossumff4af061996-01-12 01:17:50 +000064#ifdef __hpux
Guido van Rossum1e612491996-08-19 22:12:10 +000065#ifndef hpux
Guido van Rossumff4af061996-01-12 01:17:50 +000066#define hpux
67#endif
Guido van Rossum1e612491996-08-19 22:12:10 +000068#endif
Guido van Rossumff4af061996-01-12 01:17:50 +000069
Guido van Rossum1ae940a1995-01-02 19:04:15 +000070#ifdef hpux
71#define DYNAMIC_LINK
72#include <errno.h>
73typedef void (*dl_funcptr)();
74#define _DL_FUNCPTR_DEFINED 1
75#define SHORT_EXT ".sl"
76#define LONG_EXT "module.sl"
77#endif
78
Guido van Rossum9218b701997-05-05 15:03:26 +000079#if defined(__NetBSD__)
Guido van Rossum46c76a61995-01-20 16:53:54 +000080#define DYNAMIC_LINK
81#define USE_SHLIB
82
83#define dlerror() "error in dynamic linking"
84#endif
85
Guido van Rossum9b38a141996-09-11 23:12:24 +000086#ifdef MS_WINDOWS /* i.e. MS_WIN32 or MS_WIN16 */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000087#define DYNAMIC_LINK
88#include <windows.h>
89typedef FARPROC dl_funcptr;
90#define _DL_FUNCPTR_DEFINED
Guido van Rossum5fb1da71995-01-07 12:36:02 +000091#define SHORT_EXT ".pyd"
Guido van Rossume71a9471996-04-09 02:39:15 +000092#define LONG_EXT ".dll"
Guido van Rossum1ae940a1995-01-02 19:04:15 +000093#endif
94
Guido van Rossum75f288d1995-06-14 22:07:26 +000095#ifdef NeXT
Guido van Rossum1ae940a1995-01-02 19:04:15 +000096#define DYNAMIC_LINK
97#define USE_RLD
Guido van Rossum54dec591997-08-16 14:38:09 +000098#define SHORT_EXT ".so"
99#define LONG_EXT "module.so"
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000100#endif
101
102#ifdef WITH_SGI_DL
103#define DYNAMIC_LINK
104#define USE_DL
105#endif
106
107#ifdef WITH_DL_DLD
108#define DYNAMIC_LINK
109#define USE_DL
110#endif
111
Jack Jansen5d9acb61995-06-14 14:54:25 +0000112#ifdef USE_MAC_DYNAMIC_LOADING
Jack Jansen4e043731995-02-13 22:42:34 +0000113#define DYNAMIC_LINK
Guido van Rossum6a75d261995-02-18 14:51:15 +0000114#define SHORT_EXT ".slb"
Guido van Rossum1e612491996-08-19 22:12:10 +0000115#ifdef __CFM68K__
116#define LONG_EXT ".CFM68K.slb"
117#else
118#define LONG_EXT ".ppc.slb"
119#endif
Jack Jansen4e043731995-02-13 22:42:34 +0000120#ifndef _DL_FUNCPTR_DEFINED
121typedef void (*dl_funcptr)();
122#endif
123#endif
124
Guido van Rossum504f4a91996-08-20 19:59:07 +0000125#if !defined(DYNAMIC_LINK) && (defined(HAVE_DLOPEN) || defined(M_UNIX))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000126#define DYNAMIC_LINK
127#define USE_SHLIB
128#endif
129
130#ifdef _AIX
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000131#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 +0000132#define DYNAMIC_LINK
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000133#define SHORT_EXT ".so"
134#define LONG_EXT "module.so"
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000135#include <sys/ldr.h>
136typedef void (*dl_funcptr)();
137#define _DL_FUNCPTR_DEFINED
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000138static int aix_getoldmodules(void **);
139static int aix_bindnewmodule(void *, void *);
140static void aix_loaderror(char *);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000141#endif
142
143#ifdef DYNAMIC_LINK
144
145#ifdef USE_SHLIB
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000146#include <sys/types.h>
147#include <sys/stat.h>
Guido van Rossum9218b701997-05-05 15:03:26 +0000148#if defined(__NetBSD__)
Guido van Rossum46c76a61995-01-20 16:53:54 +0000149#include <nlist.h>
150#include <link.h>
151#else
Guido van Rossum504f4a91996-08-20 19:59:07 +0000152#ifdef HAVE_DLFCN_H
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000153#include <dlfcn.h>
Guido van Rossum46c76a61995-01-20 16:53:54 +0000154#endif
Guido van Rossum504f4a91996-08-20 19:59:07 +0000155#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000156#ifndef _DL_FUNCPTR_DEFINED
157typedef void (*dl_funcptr)();
158#endif
159#ifndef RTLD_LAZY
160#define RTLD_LAZY 1
161#endif
162#define SHORT_EXT ".so"
163#define LONG_EXT "module.so"
164#endif /* USE_SHLIB */
165
166#if defined(USE_DL) || defined(hpux)
167#include "dl.h"
168#endif
169
Jack Jansen5d9acb61995-06-14 14:54:25 +0000170#ifdef USE_MAC_DYNAMIC_LOADING
Jack Jansen0a72e8d1995-10-23 13:54:01 +0000171#include <Aliases.h>
Jack Jansen4e043731995-02-13 22:42:34 +0000172#include <CodeFragments.h>
Guido van Rossum79f25d91997-04-29 20:08:16 +0000173#ifdef SYMANTEC__CFM68K__ /* Really an older version of Universal Headers */
Guido van Rossum6a75d261995-02-18 14:51:15 +0000174#define CFragConnectionID ConnectionID
175#define kLoadCFrag 0x01
176#endif
Jack Jansen4e043731995-02-13 22:42:34 +0000177#include <Files.h>
178#include "macdefs.h"
179#include "macglue.h"
180#endif
181
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000182#ifdef USE_RLD
183#include <mach-o/rld.h>
184#define FUNCNAME_PATTERN "_init%.200s"
185#ifndef _DL_FUNCPTR_DEFINED
186typedef void (*dl_funcptr)();
187#endif
188#endif /* USE_RLD */
189
Guido van Rossum79f25d91997-04-29 20:08:16 +0000190extern char *Py_GetProgramName();
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000191
192#ifndef FUNCNAME_PATTERN
Guido van Rossum25e85291996-02-25 05:02:29 +0000193#if defined(__hp9000s300) || defined(__NetBSD__) || defined(__FreeBSD__) || defined(__BORLANDC__)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000194#define FUNCNAME_PATTERN "_init%.200s"
195#else
196#define FUNCNAME_PATTERN "init%.200s"
197#endif
198#endif
199
200#if !defined(SHORT_EXT) && !defined(LONG_EXT)
201#define SHORT_EXT ".o"
202#define LONG_EXT "module.o"
203#endif /* !SHORT_EXT && !LONG_EXT */
204
205#endif /* DYNAMIC_LINK */
206
Guido van Rossum79f25d91997-04-29 20:08:16 +0000207struct filedescr _PyImport_Filetab[] = {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000208#ifdef SHORT_EXT
209 {SHORT_EXT, "rb", C_EXTENSION},
210#endif /* !SHORT_EXT */
211#ifdef LONG_EXT
212 {LONG_EXT, "rb", C_EXTENSION},
213#endif /* !LONG_EXT */
214 {".py", "r", PY_SOURCE},
215 {".pyc", "rb", PY_COMPILED},
216 {0, 0}
217};
218
Guido van Rossum38234201996-07-31 17:55:19 +0000219#ifdef NO_DYNAMIC_LINK
220#undef DYNAMIC_LINK
221#endif
222
Guido van Rossum79f25d91997-04-29 20:08:16 +0000223PyObject *
224_PyImport_LoadDynamicModule(name, pathname, fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000225 char *name;
226 char *pathname;
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000227 FILE *fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000228{
229#ifndef DYNAMIC_LINK
Guido van Rossum79f25d91997-04-29 20:08:16 +0000230 PyErr_SetString(PyExc_ImportError,
231 "dynamically linked modules not supported");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000232 return NULL;
233#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000234 PyObject *m, *d, *s;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000235 char funcname[258];
236 dl_funcptr p = NULL;
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000237#ifdef USE_SHLIB
238 static struct {
239 dev_t dev;
240 ino_t ino;
241 void *handle;
242 } handles[128];
243 static int nhandles = 0;
Guido van Rossum0bbf2531996-08-09 20:55:05 +0000244 char pathbuf[260];
245 if (strchr(pathname, '/') == NULL) {
246 /* Prefix bare filename with "./" */
247 sprintf(pathbuf, "./%-.255s", pathname);
248 pathname = pathbuf;
249 }
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000250#endif
Guido van Rossum25ce5661997-08-02 03:10:38 +0000251 if ((m = _PyImport_FindExtension(name, pathname)) != NULL) {
252 Py_INCREF(m);
253 return m;
254 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000255 sprintf(funcname, FUNCNAME_PATTERN, name);
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000256#ifdef USE_SHLIB
257 if (fp != NULL) {
258 int i;
259 struct stat statb;
260 fstat(fileno(fp), &statb);
261 for (i = 0; i < nhandles; i++) {
262 if (statb.st_dev == handles[i].dev &&
263 statb.st_ino == handles[i].ino) {
264 p = (dl_funcptr) dlsym(handles[i].handle,
265 funcname);
266 goto got_it;
267 }
268 }
269 if (nhandles < 128) {
270 handles[nhandles].dev = statb.st_dev;
271 handles[nhandles].ino = statb.st_ino;
272 }
273 }
274#endif /* USE_SHLIB */
Jack Jansen5d9acb61995-06-14 14:54:25 +0000275#ifdef USE_MAC_DYNAMIC_LOADING
276 /*
Guido van Rossum79f25d91997-04-29 20:08:16 +0000277 ** Dynamic loading of CFM shared libraries on the Mac. The
278 ** code has become more convoluted than it was, because we
279 ** want to be able to put multiple modules in a single
280 ** file. For this reason, we have to determine the fragment
281 ** name, and we cannot use the library entry point but we have
282 ** to locate the correct init routine "by hand".
Jack Jansen5d9acb61995-06-14 14:54:25 +0000283 */
Jack Jansen4e043731995-02-13 22:42:34 +0000284 {
285 FSSpec libspec;
286 CFragConnectionID connID;
Guido van Rossum6a75d261995-02-18 14:51:15 +0000287 Ptr mainAddr;
288 Str255 errMessage;
289 OSErr err;
Jack Jansen5d9acb61995-06-14 14:54:25 +0000290 Boolean isfolder, didsomething;
291 char buf[512];
292 Str63 fragname;
293 Ptr symAddr;
294 CFragSymbolClass class;
Jack Jansen4e043731995-02-13 22:42:34 +0000295
Jack Jansen5d9acb61995-06-14 14:54:25 +0000296 /* First resolve any aliases to find the real file */
Jack Jansen4e043731995-02-13 22:42:34 +0000297 (void)FSMakeFSSpec(0, 0, Pstring(pathname), &libspec);
Jack Jansen5d9acb61995-06-14 14:54:25 +0000298 err = ResolveAliasFile(&libspec, 1, &isfolder, &didsomething);
299 if ( err ) {
Guido van Rossumbc2472d1997-04-30 19:07:54 +0000300 sprintf(buf, "%.255s: %.200s",
301 pathname, PyMac_StrError(err));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000302 PyErr_SetString(PyExc_ImportError, buf);
Jack Jansen5d9acb61995-06-14 14:54:25 +0000303 return NULL;
304 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000305 /* Next, determine the fragment name,
306 by stripping '.slb' and 'module' */
Jack Jansen5d9acb61995-06-14 14:54:25 +0000307 memcpy(fragname+1, libspec.name+1, libspec.name[0]);
308 fragname[0] = libspec.name[0];
Guido van Rossum79f25d91997-04-29 20:08:16 +0000309 if( strncmp((char *)(fragname+1+fragname[0]-4),
310 ".slb", 4) == 0 )
Jack Jansen5d9acb61995-06-14 14:54:25 +0000311 fragname[0] -= 4;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000312 if ( strncmp((char *)(fragname+1+fragname[0]-6),
313 "module", 6) == 0 )
Jack Jansen5d9acb61995-06-14 14:54:25 +0000314 fragname[0] -= 6;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000315 /* Load the fragment
316 (or return the connID if it is already loaded */
Jack Jansen5d9acb61995-06-14 14:54:25 +0000317 err = GetDiskFragment(&libspec, 0, 0, fragname,
Guido van Rossum6a75d261995-02-18 14:51:15 +0000318 kLoadCFrag, &connID, &mainAddr,
319 errMessage);
Jack Jansen4e043731995-02-13 22:42:34 +0000320 if ( err ) {
Guido van Rossumbc2472d1997-04-30 19:07:54 +0000321 sprintf(buf, "%.*s: %.200s",
322 errMessage[0], errMessage+1,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000323 PyMac_StrError(err));
324 PyErr_SetString(PyExc_ImportError, buf);
Jack Jansen4e043731995-02-13 22:42:34 +0000325 return NULL;
326 }
Jack Jansen5d9acb61995-06-14 14:54:25 +0000327 /* Locate the address of the correct init function */
328 err = FindSymbol(connID, Pstring(funcname), &symAddr, &class);
329 if ( err ) {
Guido van Rossumbc2472d1997-04-30 19:07:54 +0000330 sprintf(buf, "%s: %.200s",
331 funcname, 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 }
335 p = (dl_funcptr)symAddr;
Jack Jansen4e043731995-02-13 22:42:34 +0000336 }
Jack Jansen5d9acb61995-06-14 14:54:25 +0000337#endif /* USE_MAC_DYNAMIC_LOADING */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000338#ifdef USE_SHLIB
339 {
340#ifdef RTLD_NOW
341 /* RTLD_NOW: resolve externals now
342 (i.e. core dump now if some are missing) */
343 void *handle = dlopen(pathname, RTLD_NOW);
344#else
345 void *handle;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000346 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000347 printf("dlopen(\"%s\", %d);\n", pathname, RTLD_LAZY);
348 handle = dlopen(pathname, RTLD_LAZY);
349#endif /* RTLD_NOW */
350 if (handle == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000351 PyErr_SetString(PyExc_ImportError, dlerror());
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000352 return NULL;
353 }
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000354 if (fp != NULL && nhandles < 128)
355 handles[nhandles++].handle = handle;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000356 p = (dl_funcptr) dlsym(handle, funcname);
357 }
358#endif /* USE_SHLIB */
359#ifdef _AIX
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000360 /*
361 -- Invoke load() with L_NOAUTODEFER leaving the imported symbols
362 -- of the shared module unresolved. Thus we have to resolve them
363 -- explicitely with loadbind. The new module is loaded, then we
364 -- resolve its symbols using the list of already loaded modules
365 -- (only those that belong to the python executable). Get these
366 -- with loadquery(L_GETINFO).
367 */
368 {
369 static void *staticmodlistptr = NULL;
370
371 if (!staticmodlistptr)
372 if (aix_getoldmodules(&staticmodlistptr) == -1)
373 return NULL;
374 p = (dl_funcptr) load(pathname, L_NOAUTODEFER, 0);
375 if (p == NULL) {
376 aix_loaderror(pathname);
377 return NULL;
378 }
379 if (aix_bindnewmodule((void *)p, staticmodlistptr) == -1) {
380 aix_loaderror(pathname);
381 return NULL;
382 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000383 }
384#endif /* _AIX */
Guido van Rossum9b38a141996-09-11 23:12:24 +0000385#ifdef MS_WIN32
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000386 {
387 HINSTANCE hDLL;
388 hDLL = LoadLibrary(pathname);
389 if (hDLL==NULL){
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000390 char errBuf[256];
391 unsigned int errorCode;
392
393 /* Get an error string from Win32 error code */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000394 char theInfo[256]; /* Pointer to error text
395 from system */
396 int theLength; /* Length of error text */
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000397
398 errorCode = GetLastError();
399
Guido van Rossum79f25d91997-04-29 20:08:16 +0000400 theLength = FormatMessage(
401 FORMAT_MESSAGE_FROM_SYSTEM, /* flags */
402 NULL, /* message source */
403 errorCode, /* the message (error) ID */
404 0, /* default language environment */
405 (LPTSTR) theInfo, /* the buffer */
406 sizeof(theInfo), /* the buffer size */
407 NULL); /* no additional format args. */
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000408
Guido van Rossum79f25d91997-04-29 20:08:16 +0000409 /* Problem: could not get the error message.
410 This should not happen if called correctly. */
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000411 if (theLength == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000412 sprintf(errBuf,
413 "DLL load failed with error code %d",
414 errorCode);
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000415 } else {
416 int len;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000417 /* For some reason a \r\n
418 is appended to the text */
419 if (theLength >= 2 &&
420 theInfo[theLength-2] == '\r' &&
421 theInfo[theLength-1] == '\n') {
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000422 theLength -= 2;
423 theInfo[theLength] = '\0';
424 }
425 strcpy(errBuf, "DLL load failed: ");
426 len = strlen(errBuf);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000427 strncpy(errBuf+len, theInfo,
428 sizeof(errBuf)-len);
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000429 errBuf[sizeof(errBuf)-1] = '\0';
430 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000431 PyErr_SetString(PyExc_ImportError, errBuf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000432 return NULL;
433 }
434 p = GetProcAddress(hDLL, funcname);
435 }
Guido van Rossum9b38a141996-09-11 23:12:24 +0000436#endif /* MS_WIN32 */
437#ifdef MS_WIN16
Guido van Rossumdadc8241996-05-23 22:51:40 +0000438 {
439 HINSTANCE hDLL;
440 hDLL = LoadLibrary(pathname);
441 if (hDLL < HINSTANCE_ERROR){
442 char errBuf[256];
Guido van Rossum79f25d91997-04-29 20:08:16 +0000443 sprintf(errBuf,
444 "DLL load failed with error code %d", hDLL);
445 PyErr_SetString(PyExc_ImportError, errBuf);
Guido van Rossumdadc8241996-05-23 22:51:40 +0000446 return NULL;
447 }
448 p = GetProcAddress(hDLL, funcname);
449 }
Guido van Rossum9b38a141996-09-11 23:12:24 +0000450#endif /* MS_WIN16 */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000451#ifdef USE_DL
Guido van Rossum79f25d91997-04-29 20:08:16 +0000452 p = dl_loadmod(Py_GetProgramName(), pathname, funcname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000453#endif /* USE_DL */
454#ifdef USE_RLD
455 {
456 NXStream *errorStream;
457 struct mach_header *new_header;
458 const char *filenames[2];
459 long ret;
460 unsigned long ptr;
461
462 errorStream = NXOpenMemory(NULL, 0, NX_WRITEONLY);
463 filenames[0] = pathname;
464 filenames[1] = NULL;
465 ret = rld_load(errorStream, &new_header,
466 filenames, NULL);
467
468 /* extract the error messages for the exception */
469 if(!ret) {
470 char *streamBuf;
471 int len, maxLen;
472
473 NXPutc(errorStream, (char)0);
474
475 NXGetMemoryBuffer(errorStream,
476 &streamBuf, &len, &maxLen);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000477 PyErr_SetString(PyExc_ImportError, streamBuf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000478 }
479
480 if(ret && rld_lookup(errorStream, funcname, &ptr))
481 p = (dl_funcptr) ptr;
482
483 NXCloseMemory(errorStream, NX_FREEBUFFER);
484
485 if(!ret)
486 return NULL;
487 }
488#endif /* USE_RLD */
489#ifdef hpux
490 {
491 shl_t lib;
492 int flags;
493
Guido van Rossum3afb5951996-12-05 23:15:35 +0000494 flags = BIND_FIRST | BIND_DEFERRED;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000495 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000496 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000497 flags = DYNAMIC_PATH | BIND_FIRST | BIND_IMMEDIATE |
498 BIND_NONFATAL | BIND_VERBOSE;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000499 printf("shl_load %s\n",pathname);
500 }
501 lib = shl_load(pathname, flags, 0);
502 if (lib == NULL)
503 {
504 char buf[256];
Guido van Rossum79f25d91997-04-29 20:08:16 +0000505 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000506 perror(pathname);
507 sprintf(buf, "Failed to load %.200s", pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000508 PyErr_SetString(PyExc_ImportError, buf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000509 return NULL;
510 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000511 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000512 printf("shl_findsym %s\n", funcname);
513 shl_findsym(&lib, funcname, TYPE_UNDEFINED, (void *) &p);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000514 if (p == NULL && Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000515 perror(funcname);
516 }
517#endif /* hpux */
Guido van Rossum644a12b1997-04-09 19:24:53 +0000518#ifdef USE_SHLIB
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000519 got_it:
Guido van Rossum644a12b1997-04-09 19:24:53 +0000520#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000521 if (p == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000522 PyErr_SetString(PyExc_ImportError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000523 "dynamic module does not define init function");
524 return NULL;
525 }
526 (*p)();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000527 if (PyErr_Occurred())
528 return NULL;
529 if (_PyImport_FixupExtension(name, pathname) == NULL)
530 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000531
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000532 m = PyDict_GetItemString(PyImport_GetModuleDict(), name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000533 if (m == NULL) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000534 PyErr_SetString(PyExc_SystemError,
535 "dynamic module not initialized properly");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000536 return NULL;
537 }
Guido van Rossum1e612491996-08-19 22:12:10 +0000538 /* Remember the filename as the __file__ attribute */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000539 d = PyModule_GetDict(m);
540 s = PyString_FromString(pathname);
541 if (s == NULL || PyDict_SetItemString(d, "__file__", s) != 0)
542 PyErr_Clear(); /* Not important enough to report */
543 Py_XDECREF(s);
544 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000545 fprintf(stderr,
546 "import %s # dynamically loaded from %s\n",
547 name, pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000548 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000549 return m;
550#endif /* DYNAMIC_LINK */
551}
552
553
554#ifdef _AIX
555
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000556#include <ctype.h> /* for isdigit() */
557#include <errno.h> /* for global errno */
558#include <string.h> /* for strerror() */
559#include <stdlib.h> /* for malloc(), free() */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000560
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000561typedef struct Module {
562 struct Module *next;
563 void *entry;
564} Module, *ModulePtr;
565
566static int
567aix_getoldmodules(modlistptr)
568 void **modlistptr;
569{
570 register ModulePtr modptr, prevmodptr;
571 register struct ld_info *ldiptr;
572 register char *ldibuf;
573 register int errflag, bufsize = 1024;
574 register unsigned int offset;
575
576 /*
577 -- Get the list of loaded modules into ld_info structures.
578 */
579 if ((ldibuf = malloc(bufsize)) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000580 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000581 return -1;
582 }
583 while ((errflag = loadquery(L_GETINFO, ldibuf, bufsize)) == -1
584 && errno == ENOMEM) {
585 free(ldibuf);
586 bufsize += 1024;
587 if ((ldibuf = malloc(bufsize)) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000588 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000589 return -1;
590 }
591 }
592 if (errflag == -1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000593 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000594 return -1;
595 }
596 /*
597 -- Make the modules list from the ld_info structures.
598 */
599 ldiptr = (struct ld_info *)ldibuf;
600 prevmodptr = NULL;
601 do {
602 if ((modptr = (ModulePtr)malloc(sizeof(Module))) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000603 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000604 while (*modlistptr) {
605 modptr = (ModulePtr)*modlistptr;
606 *modlistptr = (void *)modptr->next;
607 free(modptr);
608 }
609 return -1;
610 }
611 modptr->entry = ldiptr->ldinfo_dataorg;
612 modptr->next = NULL;
613 if (prevmodptr == NULL)
614 *modlistptr = (void *)modptr;
615 else
616 prevmodptr->next = modptr;
617 prevmodptr = modptr;
618 offset = (unsigned int)ldiptr->ldinfo_next;
619 ldiptr = (struct ld_info *)((unsigned int)ldiptr + offset);
620 } while (offset);
621 free(ldibuf);
622 return 0;
623}
624
625static int
626aix_bindnewmodule(newmoduleptr, modlistptr)
627 void *newmoduleptr;
628 void *modlistptr;
629{
630 register ModulePtr modptr;
631
632 /*
633 -- Bind the new module with the list of loaded modules.
634 */
635 for (modptr = (ModulePtr)modlistptr; modptr; modptr = modptr->next)
636 if (loadbind(0, modptr->entry, newmoduleptr) != 0)
637 return -1;
638 return 0;
639}
640
641static void
642aix_loaderror(pathname)
643 char *pathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000644{
645
Guido van Rossum236f62d1996-06-26 21:07:08 +0000646 char *message[1024], errbuf[1024];
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000647 register int i,j;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000648
649 struct errtab {
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000650 int errNo;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000651 char *errstr;
652 } load_errtab[] = {
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000653 {L_ERROR_TOOMANY, "too many errors, rest skipped."},
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000654 {L_ERROR_NOLIB, "can't load library:"},
655 {L_ERROR_UNDEF, "can't find symbol in library:"},
656 {L_ERROR_RLDBAD,
657 "RLD index out of range or bad relocation type:"},
658 {L_ERROR_FORMAT, "not a valid, executable xcoff file:"},
659 {L_ERROR_MEMBER,
660 "file not an archive or does not contain requested member:"},
661 {L_ERROR_TYPE, "symbol table mismatch:"},
Guido van Rossum236f62d1996-06-26 21:07:08 +0000662 {L_ERROR_ALIGN, "text alignment in file is wrong."},
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000663 {L_ERROR_SYSTEM, "System error:"},
664 {L_ERROR_ERRNO, NULL}
665 };
666
667#define LOAD_ERRTAB_LEN (sizeof(load_errtab)/sizeof(load_errtab[0]))
668#define ERRBUF_APPEND(s) strncat(errbuf, s, sizeof(errbuf)-strlen(errbuf)-1)
669
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000670 sprintf(errbuf, "from module %.200s ", pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000671
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000672 if (!loadquery(L_GETMESSAGES, &message[0], sizeof(message))) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000673 ERRBUF_APPEND(strerror(errno));
Guido van Rossum236f62d1996-06-26 21:07:08 +0000674 ERRBUF_APPEND("\n");
675 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000676 for(i = 0; message[i] && *message[i]; i++) {
677 int nerr = atoi(message[i]);
678 for (j=0; j<LOAD_ERRTAB_LEN ; j++) {
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000679 if (nerr == load_errtab[j].errNo && load_errtab[j].errstr)
Guido van Rossum236f62d1996-06-26 21:07:08 +0000680 ERRBUF_APPEND(load_errtab[j].errstr);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000681 }
682 while (isdigit(*message[i])) message[i]++ ;
683 ERRBUF_APPEND(message[i]);
684 ERRBUF_APPEND("\n");
685 }
686 errbuf[strlen(errbuf)-1] = '\0'; /* trim off last newline */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000687 PyErr_SetString(PyExc_ImportError, errbuf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000688 return;
689}
690
691#endif /* _AIX */