blob: b372e46b59c8d96b996ed773f41eab3ebb0c0f5d [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
98#endif
99
100#ifdef WITH_SGI_DL
101#define DYNAMIC_LINK
102#define USE_DL
103#endif
104
105#ifdef WITH_DL_DLD
106#define DYNAMIC_LINK
107#define USE_DL
108#endif
109
Jack Jansen5d9acb61995-06-14 14:54:25 +0000110#ifdef USE_MAC_DYNAMIC_LOADING
Jack Jansen4e043731995-02-13 22:42:34 +0000111#define DYNAMIC_LINK
Guido van Rossum6a75d261995-02-18 14:51:15 +0000112#define SHORT_EXT ".slb"
Guido van Rossum1e612491996-08-19 22:12:10 +0000113#ifdef __CFM68K__
114#define LONG_EXT ".CFM68K.slb"
115#else
116#define LONG_EXT ".ppc.slb"
117#endif
Jack Jansen4e043731995-02-13 22:42:34 +0000118#ifndef _DL_FUNCPTR_DEFINED
119typedef void (*dl_funcptr)();
120#endif
121#endif
122
Guido van Rossum504f4a91996-08-20 19:59:07 +0000123#if !defined(DYNAMIC_LINK) && (defined(HAVE_DLOPEN) || defined(M_UNIX))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000124#define DYNAMIC_LINK
125#define USE_SHLIB
126#endif
127
128#ifdef _AIX
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000129#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 +0000130#define DYNAMIC_LINK
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000131#define SHORT_EXT ".so"
132#define LONG_EXT "module.so"
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000133#include <sys/ldr.h>
134typedef void (*dl_funcptr)();
135#define _DL_FUNCPTR_DEFINED
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000136static int aix_getoldmodules(void **);
137static int aix_bindnewmodule(void *, void *);
138static void aix_loaderror(char *);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000139#endif
140
141#ifdef DYNAMIC_LINK
142
143#ifdef USE_SHLIB
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000144#include <sys/types.h>
145#include <sys/stat.h>
Guido van Rossum9218b701997-05-05 15:03:26 +0000146#if defined(__NetBSD__)
Guido van Rossum46c76a61995-01-20 16:53:54 +0000147#include <nlist.h>
148#include <link.h>
149#else
Guido van Rossum504f4a91996-08-20 19:59:07 +0000150#ifdef HAVE_DLFCN_H
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000151#include <dlfcn.h>
Guido van Rossum46c76a61995-01-20 16:53:54 +0000152#endif
Guido van Rossum504f4a91996-08-20 19:59:07 +0000153#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000154#ifndef _DL_FUNCPTR_DEFINED
155typedef void (*dl_funcptr)();
156#endif
157#ifndef RTLD_LAZY
158#define RTLD_LAZY 1
159#endif
160#define SHORT_EXT ".so"
161#define LONG_EXT "module.so"
162#endif /* USE_SHLIB */
163
164#if defined(USE_DL) || defined(hpux)
165#include "dl.h"
166#endif
167
Jack Jansen5d9acb61995-06-14 14:54:25 +0000168#ifdef USE_MAC_DYNAMIC_LOADING
Jack Jansen0a72e8d1995-10-23 13:54:01 +0000169#include <Aliases.h>
Jack Jansen4e043731995-02-13 22:42:34 +0000170#include <CodeFragments.h>
Guido van Rossum79f25d91997-04-29 20:08:16 +0000171#ifdef SYMANTEC__CFM68K__ /* Really an older version of Universal Headers */
Guido van Rossum6a75d261995-02-18 14:51:15 +0000172#define CFragConnectionID ConnectionID
173#define kLoadCFrag 0x01
174#endif
Jack Jansen4e043731995-02-13 22:42:34 +0000175#include <Files.h>
176#include "macdefs.h"
177#include "macglue.h"
178#endif
179
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000180#ifdef USE_RLD
181#include <mach-o/rld.h>
182#define FUNCNAME_PATTERN "_init%.200s"
183#ifndef _DL_FUNCPTR_DEFINED
184typedef void (*dl_funcptr)();
185#endif
186#endif /* USE_RLD */
187
Guido van Rossum79f25d91997-04-29 20:08:16 +0000188extern char *Py_GetProgramName();
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000189
190#ifndef FUNCNAME_PATTERN
Guido van Rossum25e85291996-02-25 05:02:29 +0000191#if defined(__hp9000s300) || defined(__NetBSD__) || defined(__FreeBSD__) || defined(__BORLANDC__)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000192#define FUNCNAME_PATTERN "_init%.200s"
193#else
194#define FUNCNAME_PATTERN "init%.200s"
195#endif
196#endif
197
198#if !defined(SHORT_EXT) && !defined(LONG_EXT)
199#define SHORT_EXT ".o"
200#define LONG_EXT "module.o"
201#endif /* !SHORT_EXT && !LONG_EXT */
202
203#endif /* DYNAMIC_LINK */
204
Guido van Rossum79f25d91997-04-29 20:08:16 +0000205struct filedescr _PyImport_Filetab[] = {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000206#ifdef SHORT_EXT
207 {SHORT_EXT, "rb", C_EXTENSION},
208#endif /* !SHORT_EXT */
209#ifdef LONG_EXT
210 {LONG_EXT, "rb", C_EXTENSION},
211#endif /* !LONG_EXT */
212 {".py", "r", PY_SOURCE},
213 {".pyc", "rb", PY_COMPILED},
214 {0, 0}
215};
216
Guido van Rossum38234201996-07-31 17:55:19 +0000217#ifdef NO_DYNAMIC_LINK
218#undef DYNAMIC_LINK
219#endif
220
Guido van Rossum79f25d91997-04-29 20:08:16 +0000221PyObject *
222_PyImport_LoadDynamicModule(name, pathname, fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000223 char *name;
224 char *pathname;
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000225 FILE *fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000226{
227#ifndef DYNAMIC_LINK
Guido van Rossum79f25d91997-04-29 20:08:16 +0000228 PyErr_SetString(PyExc_ImportError,
229 "dynamically linked modules not supported");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000230 return NULL;
231#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000232 PyObject *m, *d, *s;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000233 char funcname[258];
234 dl_funcptr p = NULL;
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000235#ifdef USE_SHLIB
236 static struct {
237 dev_t dev;
238 ino_t ino;
239 void *handle;
240 } handles[128];
241 static int nhandles = 0;
Guido van Rossum0bbf2531996-08-09 20:55:05 +0000242 char pathbuf[260];
243 if (strchr(pathname, '/') == NULL) {
244 /* Prefix bare filename with "./" */
245 sprintf(pathbuf, "./%-.255s", pathname);
246 pathname = pathbuf;
247 }
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000248#endif
Guido van Rossum25ce5661997-08-02 03:10:38 +0000249 if ((m = _PyImport_FindExtension(name, pathname)) != NULL) {
250 Py_INCREF(m);
251 return m;
252 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000253 sprintf(funcname, FUNCNAME_PATTERN, name);
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000254#ifdef USE_SHLIB
255 if (fp != NULL) {
256 int i;
257 struct stat statb;
258 fstat(fileno(fp), &statb);
259 for (i = 0; i < nhandles; i++) {
260 if (statb.st_dev == handles[i].dev &&
261 statb.st_ino == handles[i].ino) {
262 p = (dl_funcptr) dlsym(handles[i].handle,
263 funcname);
264 goto got_it;
265 }
266 }
267 if (nhandles < 128) {
268 handles[nhandles].dev = statb.st_dev;
269 handles[nhandles].ino = statb.st_ino;
270 }
271 }
272#endif /* USE_SHLIB */
Jack Jansen5d9acb61995-06-14 14:54:25 +0000273#ifdef USE_MAC_DYNAMIC_LOADING
274 /*
Guido van Rossum79f25d91997-04-29 20:08:16 +0000275 ** Dynamic loading of CFM shared libraries on the Mac. The
276 ** code has become more convoluted than it was, because we
277 ** want to be able to put multiple modules in a single
278 ** file. For this reason, we have to determine the fragment
279 ** name, and we cannot use the library entry point but we have
280 ** to locate the correct init routine "by hand".
Jack Jansen5d9acb61995-06-14 14:54:25 +0000281 */
Jack Jansen4e043731995-02-13 22:42:34 +0000282 {
283 FSSpec libspec;
284 CFragConnectionID connID;
Guido van Rossum6a75d261995-02-18 14:51:15 +0000285 Ptr mainAddr;
286 Str255 errMessage;
287 OSErr err;
Jack Jansen5d9acb61995-06-14 14:54:25 +0000288 Boolean isfolder, didsomething;
289 char buf[512];
290 Str63 fragname;
291 Ptr symAddr;
292 CFragSymbolClass class;
Jack Jansen4e043731995-02-13 22:42:34 +0000293
Jack Jansen5d9acb61995-06-14 14:54:25 +0000294 /* First resolve any aliases to find the real file */
Jack Jansen4e043731995-02-13 22:42:34 +0000295 (void)FSMakeFSSpec(0, 0, Pstring(pathname), &libspec);
Jack Jansen5d9acb61995-06-14 14:54:25 +0000296 err = ResolveAliasFile(&libspec, 1, &isfolder, &didsomething);
297 if ( err ) {
Guido van Rossumbc2472d1997-04-30 19:07:54 +0000298 sprintf(buf, "%.255s: %.200s",
299 pathname, PyMac_StrError(err));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000300 PyErr_SetString(PyExc_ImportError, buf);
Jack Jansen5d9acb61995-06-14 14:54:25 +0000301 return NULL;
302 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000303 /* Next, determine the fragment name,
304 by stripping '.slb' and 'module' */
Jack Jansen5d9acb61995-06-14 14:54:25 +0000305 memcpy(fragname+1, libspec.name+1, libspec.name[0]);
306 fragname[0] = libspec.name[0];
Guido van Rossum79f25d91997-04-29 20:08:16 +0000307 if( strncmp((char *)(fragname+1+fragname[0]-4),
308 ".slb", 4) == 0 )
Jack Jansen5d9acb61995-06-14 14:54:25 +0000309 fragname[0] -= 4;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000310 if ( strncmp((char *)(fragname+1+fragname[0]-6),
311 "module", 6) == 0 )
Jack Jansen5d9acb61995-06-14 14:54:25 +0000312 fragname[0] -= 6;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000313 /* Load the fragment
314 (or return the connID if it is already loaded */
Jack Jansen5d9acb61995-06-14 14:54:25 +0000315 err = GetDiskFragment(&libspec, 0, 0, fragname,
Guido van Rossum6a75d261995-02-18 14:51:15 +0000316 kLoadCFrag, &connID, &mainAddr,
317 errMessage);
Jack Jansen4e043731995-02-13 22:42:34 +0000318 if ( err ) {
Guido van Rossumbc2472d1997-04-30 19:07:54 +0000319 sprintf(buf, "%.*s: %.200s",
320 errMessage[0], errMessage+1,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000321 PyMac_StrError(err));
322 PyErr_SetString(PyExc_ImportError, buf);
Jack Jansen4e043731995-02-13 22:42:34 +0000323 return NULL;
324 }
Jack Jansen5d9acb61995-06-14 14:54:25 +0000325 /* Locate the address of the correct init function */
326 err = FindSymbol(connID, Pstring(funcname), &symAddr, &class);
327 if ( err ) {
Guido van Rossumbc2472d1997-04-30 19:07:54 +0000328 sprintf(buf, "%s: %.200s",
329 funcname, PyMac_StrError(err));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000330 PyErr_SetString(PyExc_ImportError, buf);
Jack Jansen5d9acb61995-06-14 14:54:25 +0000331 return NULL;
332 }
333 p = (dl_funcptr)symAddr;
Jack Jansen4e043731995-02-13 22:42:34 +0000334 }
Jack Jansen5d9acb61995-06-14 14:54:25 +0000335#endif /* USE_MAC_DYNAMIC_LOADING */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000336#ifdef USE_SHLIB
337 {
338#ifdef RTLD_NOW
339 /* RTLD_NOW: resolve externals now
340 (i.e. core dump now if some are missing) */
341 void *handle = dlopen(pathname, RTLD_NOW);
342#else
343 void *handle;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000344 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000345 printf("dlopen(\"%s\", %d);\n", pathname, RTLD_LAZY);
346 handle = dlopen(pathname, RTLD_LAZY);
347#endif /* RTLD_NOW */
348 if (handle == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000349 PyErr_SetString(PyExc_ImportError, dlerror());
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000350 return NULL;
351 }
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000352 if (fp != NULL && nhandles < 128)
353 handles[nhandles++].handle = handle;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000354 p = (dl_funcptr) dlsym(handle, funcname);
355 }
356#endif /* USE_SHLIB */
357#ifdef _AIX
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000358 /*
359 -- Invoke load() with L_NOAUTODEFER leaving the imported symbols
360 -- of the shared module unresolved. Thus we have to resolve them
361 -- explicitely with loadbind. The new module is loaded, then we
362 -- resolve its symbols using the list of already loaded modules
363 -- (only those that belong to the python executable). Get these
364 -- with loadquery(L_GETINFO).
365 */
366 {
367 static void *staticmodlistptr = NULL;
368
369 if (!staticmodlistptr)
370 if (aix_getoldmodules(&staticmodlistptr) == -1)
371 return NULL;
372 p = (dl_funcptr) load(pathname, L_NOAUTODEFER, 0);
373 if (p == NULL) {
374 aix_loaderror(pathname);
375 return NULL;
376 }
377 if (aix_bindnewmodule((void *)p, staticmodlistptr) == -1) {
378 aix_loaderror(pathname);
379 return NULL;
380 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000381 }
382#endif /* _AIX */
Guido van Rossum9b38a141996-09-11 23:12:24 +0000383#ifdef MS_WIN32
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000384 {
385 HINSTANCE hDLL;
386 hDLL = LoadLibrary(pathname);
387 if (hDLL==NULL){
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000388 char errBuf[256];
389 unsigned int errorCode;
390
391 /* Get an error string from Win32 error code */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000392 char theInfo[256]; /* Pointer to error text
393 from system */
394 int theLength; /* Length of error text */
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000395
396 errorCode = GetLastError();
397
Guido van Rossum79f25d91997-04-29 20:08:16 +0000398 theLength = FormatMessage(
399 FORMAT_MESSAGE_FROM_SYSTEM, /* flags */
400 NULL, /* message source */
401 errorCode, /* the message (error) ID */
402 0, /* default language environment */
403 (LPTSTR) theInfo, /* the buffer */
404 sizeof(theInfo), /* the buffer size */
405 NULL); /* no additional format args. */
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000406
Guido van Rossum79f25d91997-04-29 20:08:16 +0000407 /* Problem: could not get the error message.
408 This should not happen if called correctly. */
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000409 if (theLength == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000410 sprintf(errBuf,
411 "DLL load failed with error code %d",
412 errorCode);
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000413 } else {
414 int len;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000415 /* For some reason a \r\n
416 is appended to the text */
417 if (theLength >= 2 &&
418 theInfo[theLength-2] == '\r' &&
419 theInfo[theLength-1] == '\n') {
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000420 theLength -= 2;
421 theInfo[theLength] = '\0';
422 }
423 strcpy(errBuf, "DLL load failed: ");
424 len = strlen(errBuf);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000425 strncpy(errBuf+len, theInfo,
426 sizeof(errBuf)-len);
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000427 errBuf[sizeof(errBuf)-1] = '\0';
428 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000429 PyErr_SetString(PyExc_ImportError, errBuf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000430 return NULL;
431 }
432 p = GetProcAddress(hDLL, funcname);
433 }
Guido van Rossum9b38a141996-09-11 23:12:24 +0000434#endif /* MS_WIN32 */
435#ifdef MS_WIN16
Guido van Rossumdadc8241996-05-23 22:51:40 +0000436 {
437 HINSTANCE hDLL;
438 hDLL = LoadLibrary(pathname);
439 if (hDLL < HINSTANCE_ERROR){
440 char errBuf[256];
Guido van Rossum79f25d91997-04-29 20:08:16 +0000441 sprintf(errBuf,
442 "DLL load failed with error code %d", hDLL);
443 PyErr_SetString(PyExc_ImportError, errBuf);
Guido van Rossumdadc8241996-05-23 22:51:40 +0000444 return NULL;
445 }
446 p = GetProcAddress(hDLL, funcname);
447 }
Guido van Rossum9b38a141996-09-11 23:12:24 +0000448#endif /* MS_WIN16 */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000449#ifdef USE_DL
Guido van Rossum79f25d91997-04-29 20:08:16 +0000450 p = dl_loadmod(Py_GetProgramName(), pathname, funcname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000451#endif /* USE_DL */
452#ifdef USE_RLD
453 {
454 NXStream *errorStream;
455 struct mach_header *new_header;
456 const char *filenames[2];
457 long ret;
458 unsigned long ptr;
459
460 errorStream = NXOpenMemory(NULL, 0, NX_WRITEONLY);
461 filenames[0] = pathname;
462 filenames[1] = NULL;
463 ret = rld_load(errorStream, &new_header,
464 filenames, NULL);
465
466 /* extract the error messages for the exception */
467 if(!ret) {
468 char *streamBuf;
469 int len, maxLen;
470
471 NXPutc(errorStream, (char)0);
472
473 NXGetMemoryBuffer(errorStream,
474 &streamBuf, &len, &maxLen);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000475 PyErr_SetString(PyExc_ImportError, streamBuf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000476 }
477
478 if(ret && rld_lookup(errorStream, funcname, &ptr))
479 p = (dl_funcptr) ptr;
480
481 NXCloseMemory(errorStream, NX_FREEBUFFER);
482
483 if(!ret)
484 return NULL;
485 }
486#endif /* USE_RLD */
487#ifdef hpux
488 {
489 shl_t lib;
490 int flags;
491
Guido van Rossum3afb5951996-12-05 23:15:35 +0000492 flags = BIND_FIRST | BIND_DEFERRED;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000493 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000494 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000495 flags = DYNAMIC_PATH | BIND_FIRST | BIND_IMMEDIATE |
496 BIND_NONFATAL | BIND_VERBOSE;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000497 printf("shl_load %s\n",pathname);
498 }
499 lib = shl_load(pathname, flags, 0);
500 if (lib == NULL)
501 {
502 char buf[256];
Guido van Rossum79f25d91997-04-29 20:08:16 +0000503 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000504 perror(pathname);
505 sprintf(buf, "Failed to load %.200s", pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000506 PyErr_SetString(PyExc_ImportError, buf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000507 return NULL;
508 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000509 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000510 printf("shl_findsym %s\n", funcname);
511 shl_findsym(&lib, funcname, TYPE_UNDEFINED, (void *) &p);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000512 if (p == NULL && Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000513 perror(funcname);
514 }
515#endif /* hpux */
Guido van Rossum644a12b1997-04-09 19:24:53 +0000516#ifdef USE_SHLIB
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000517 got_it:
Guido van Rossum644a12b1997-04-09 19:24:53 +0000518#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000519 if (p == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000520 PyErr_SetString(PyExc_ImportError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000521 "dynamic module does not define init function");
522 return NULL;
523 }
524 (*p)();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000525 if (PyErr_Occurred())
526 return NULL;
527 if (_PyImport_FixupExtension(name, pathname) == NULL)
528 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000529
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000530 m = PyDict_GetItemString(PyImport_GetModuleDict(), name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000531 if (m == NULL) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000532 PyErr_SetString(PyExc_SystemError,
533 "dynamic module not initialized properly");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000534 return NULL;
535 }
Guido van Rossum1e612491996-08-19 22:12:10 +0000536 /* Remember the filename as the __file__ attribute */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000537 d = PyModule_GetDict(m);
538 s = PyString_FromString(pathname);
539 if (s == NULL || PyDict_SetItemString(d, "__file__", s) != 0)
540 PyErr_Clear(); /* Not important enough to report */
541 Py_XDECREF(s);
542 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000543 fprintf(stderr,
544 "import %s # dynamically loaded from %s\n",
545 name, pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000546 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000547 return m;
548#endif /* DYNAMIC_LINK */
549}
550
551
552#ifdef _AIX
553
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000554#include <ctype.h> /* for isdigit() */
555#include <errno.h> /* for global errno */
556#include <string.h> /* for strerror() */
557#include <stdlib.h> /* for malloc(), free() */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000558
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000559typedef struct Module {
560 struct Module *next;
561 void *entry;
562} Module, *ModulePtr;
563
564static int
565aix_getoldmodules(modlistptr)
566 void **modlistptr;
567{
568 register ModulePtr modptr, prevmodptr;
569 register struct ld_info *ldiptr;
570 register char *ldibuf;
571 register int errflag, bufsize = 1024;
572 register unsigned int offset;
573
574 /*
575 -- Get the list of loaded modules into ld_info structures.
576 */
577 if ((ldibuf = malloc(bufsize)) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000578 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000579 return -1;
580 }
581 while ((errflag = loadquery(L_GETINFO, ldibuf, bufsize)) == -1
582 && errno == ENOMEM) {
583 free(ldibuf);
584 bufsize += 1024;
585 if ((ldibuf = malloc(bufsize)) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000586 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000587 return -1;
588 }
589 }
590 if (errflag == -1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000591 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000592 return -1;
593 }
594 /*
595 -- Make the modules list from the ld_info structures.
596 */
597 ldiptr = (struct ld_info *)ldibuf;
598 prevmodptr = NULL;
599 do {
600 if ((modptr = (ModulePtr)malloc(sizeof(Module))) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000601 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000602 while (*modlistptr) {
603 modptr = (ModulePtr)*modlistptr;
604 *modlistptr = (void *)modptr->next;
605 free(modptr);
606 }
607 return -1;
608 }
609 modptr->entry = ldiptr->ldinfo_dataorg;
610 modptr->next = NULL;
611 if (prevmodptr == NULL)
612 *modlistptr = (void *)modptr;
613 else
614 prevmodptr->next = modptr;
615 prevmodptr = modptr;
616 offset = (unsigned int)ldiptr->ldinfo_next;
617 ldiptr = (struct ld_info *)((unsigned int)ldiptr + offset);
618 } while (offset);
619 free(ldibuf);
620 return 0;
621}
622
623static int
624aix_bindnewmodule(newmoduleptr, modlistptr)
625 void *newmoduleptr;
626 void *modlistptr;
627{
628 register ModulePtr modptr;
629
630 /*
631 -- Bind the new module with the list of loaded modules.
632 */
633 for (modptr = (ModulePtr)modlistptr; modptr; modptr = modptr->next)
634 if (loadbind(0, modptr->entry, newmoduleptr) != 0)
635 return -1;
636 return 0;
637}
638
639static void
640aix_loaderror(pathname)
641 char *pathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000642{
643
Guido van Rossum236f62d1996-06-26 21:07:08 +0000644 char *message[1024], errbuf[1024];
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000645 register int i,j;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000646
647 struct errtab {
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000648 int errNo;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000649 char *errstr;
650 } load_errtab[] = {
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000651 {L_ERROR_TOOMANY, "too many errors, rest skipped."},
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000652 {L_ERROR_NOLIB, "can't load library:"},
653 {L_ERROR_UNDEF, "can't find symbol in library:"},
654 {L_ERROR_RLDBAD,
655 "RLD index out of range or bad relocation type:"},
656 {L_ERROR_FORMAT, "not a valid, executable xcoff file:"},
657 {L_ERROR_MEMBER,
658 "file not an archive or does not contain requested member:"},
659 {L_ERROR_TYPE, "symbol table mismatch:"},
Guido van Rossum236f62d1996-06-26 21:07:08 +0000660 {L_ERROR_ALIGN, "text alignment in file is wrong."},
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000661 {L_ERROR_SYSTEM, "System error:"},
662 {L_ERROR_ERRNO, NULL}
663 };
664
665#define LOAD_ERRTAB_LEN (sizeof(load_errtab)/sizeof(load_errtab[0]))
666#define ERRBUF_APPEND(s) strncat(errbuf, s, sizeof(errbuf)-strlen(errbuf)-1)
667
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000668 sprintf(errbuf, "from module %.200s ", pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000669
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000670 if (!loadquery(L_GETMESSAGES, &message[0], sizeof(message))) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000671 ERRBUF_APPEND(strerror(errno));
Guido van Rossum236f62d1996-06-26 21:07:08 +0000672 ERRBUF_APPEND("\n");
673 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000674 for(i = 0; message[i] && *message[i]; i++) {
675 int nerr = atoi(message[i]);
676 for (j=0; j<LOAD_ERRTAB_LEN ; j++) {
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000677 if (nerr == load_errtab[j].errNo && load_errtab[j].errstr)
Guido van Rossum236f62d1996-06-26 21:07:08 +0000678 ERRBUF_APPEND(load_errtab[j].errstr);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000679 }
680 while (isdigit(*message[i])) message[i]++ ;
681 ERRBUF_APPEND(message[i]);
682 ERRBUF_APPEND("\n");
683 }
684 errbuf[strlen(errbuf)-1] = '\0'; /* trim off last newline */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000685 PyErr_SetString(PyExc_ImportError, errbuf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000686 return;
687}
688
689#endif /* _AIX */