blob: 44f57ac358aac456279385a1a42466f71478475b [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 Rossum1ae940a1995-01-02 19:04:15 +0000249 sprintf(funcname, FUNCNAME_PATTERN, name);
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000250#ifdef USE_SHLIB
251 if (fp != NULL) {
252 int i;
253 struct stat statb;
254 fstat(fileno(fp), &statb);
255 for (i = 0; i < nhandles; i++) {
256 if (statb.st_dev == handles[i].dev &&
257 statb.st_ino == handles[i].ino) {
258 p = (dl_funcptr) dlsym(handles[i].handle,
259 funcname);
260 goto got_it;
261 }
262 }
263 if (nhandles < 128) {
264 handles[nhandles].dev = statb.st_dev;
265 handles[nhandles].ino = statb.st_ino;
266 }
267 }
268#endif /* USE_SHLIB */
Jack Jansen5d9acb61995-06-14 14:54:25 +0000269#ifdef USE_MAC_DYNAMIC_LOADING
270 /*
Guido van Rossum79f25d91997-04-29 20:08:16 +0000271 ** Dynamic loading of CFM shared libraries on the Mac. The
272 ** code has become more convoluted than it was, because we
273 ** want to be able to put multiple modules in a single
274 ** file. For this reason, we have to determine the fragment
275 ** name, and we cannot use the library entry point but we have
276 ** to locate the correct init routine "by hand".
Jack Jansen5d9acb61995-06-14 14:54:25 +0000277 */
Jack Jansen4e043731995-02-13 22:42:34 +0000278 {
279 FSSpec libspec;
280 CFragConnectionID connID;
Guido van Rossum6a75d261995-02-18 14:51:15 +0000281 Ptr mainAddr;
282 Str255 errMessage;
283 OSErr err;
Jack Jansen5d9acb61995-06-14 14:54:25 +0000284 Boolean isfolder, didsomething;
285 char buf[512];
286 Str63 fragname;
287 Ptr symAddr;
288 CFragSymbolClass class;
Jack Jansen4e043731995-02-13 22:42:34 +0000289
Jack Jansen5d9acb61995-06-14 14:54:25 +0000290 /* First resolve any aliases to find the real file */
Jack Jansen4e043731995-02-13 22:42:34 +0000291 (void)FSMakeFSSpec(0, 0, Pstring(pathname), &libspec);
Jack Jansen5d9acb61995-06-14 14:54:25 +0000292 err = ResolveAliasFile(&libspec, 1, &isfolder, &didsomething);
293 if ( err ) {
Guido van Rossumbc2472d1997-04-30 19:07:54 +0000294 sprintf(buf, "%.255s: %.200s",
295 pathname, PyMac_StrError(err));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000296 PyErr_SetString(PyExc_ImportError, buf);
Jack Jansen5d9acb61995-06-14 14:54:25 +0000297 return NULL;
298 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000299 /* Next, determine the fragment name,
300 by stripping '.slb' and 'module' */
Jack Jansen5d9acb61995-06-14 14:54:25 +0000301 memcpy(fragname+1, libspec.name+1, libspec.name[0]);
302 fragname[0] = libspec.name[0];
Guido van Rossum79f25d91997-04-29 20:08:16 +0000303 if( strncmp((char *)(fragname+1+fragname[0]-4),
304 ".slb", 4) == 0 )
Jack Jansen5d9acb61995-06-14 14:54:25 +0000305 fragname[0] -= 4;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000306 if ( strncmp((char *)(fragname+1+fragname[0]-6),
307 "module", 6) == 0 )
Jack Jansen5d9acb61995-06-14 14:54:25 +0000308 fragname[0] -= 6;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000309 /* Load the fragment
310 (or return the connID if it is already loaded */
Jack Jansen5d9acb61995-06-14 14:54:25 +0000311 err = GetDiskFragment(&libspec, 0, 0, fragname,
Guido van Rossum6a75d261995-02-18 14:51:15 +0000312 kLoadCFrag, &connID, &mainAddr,
313 errMessage);
Jack Jansen4e043731995-02-13 22:42:34 +0000314 if ( err ) {
Guido van Rossumbc2472d1997-04-30 19:07:54 +0000315 sprintf(buf, "%.*s: %.200s",
316 errMessage[0], errMessage+1,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000317 PyMac_StrError(err));
318 PyErr_SetString(PyExc_ImportError, buf);
Jack Jansen4e043731995-02-13 22:42:34 +0000319 return NULL;
320 }
Jack Jansen5d9acb61995-06-14 14:54:25 +0000321 /* Locate the address of the correct init function */
322 err = FindSymbol(connID, Pstring(funcname), &symAddr, &class);
323 if ( err ) {
Guido van Rossumbc2472d1997-04-30 19:07:54 +0000324 sprintf(buf, "%s: %.200s",
325 funcname, PyMac_StrError(err));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000326 PyErr_SetString(PyExc_ImportError, buf);
Jack Jansen5d9acb61995-06-14 14:54:25 +0000327 return NULL;
328 }
329 p = (dl_funcptr)symAddr;
Jack Jansen4e043731995-02-13 22:42:34 +0000330 }
Jack Jansen5d9acb61995-06-14 14:54:25 +0000331#endif /* USE_MAC_DYNAMIC_LOADING */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000332#ifdef USE_SHLIB
333 {
334#ifdef RTLD_NOW
335 /* RTLD_NOW: resolve externals now
336 (i.e. core dump now if some are missing) */
337 void *handle = dlopen(pathname, RTLD_NOW);
338#else
339 void *handle;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000340 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000341 printf("dlopen(\"%s\", %d);\n", pathname, RTLD_LAZY);
342 handle = dlopen(pathname, RTLD_LAZY);
343#endif /* RTLD_NOW */
344 if (handle == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000345 PyErr_SetString(PyExc_ImportError, dlerror());
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000346 return NULL;
347 }
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000348 if (fp != NULL && nhandles < 128)
349 handles[nhandles++].handle = handle;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000350 p = (dl_funcptr) dlsym(handle, funcname);
351 }
352#endif /* USE_SHLIB */
353#ifdef _AIX
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000354 /*
355 -- Invoke load() with L_NOAUTODEFER leaving the imported symbols
356 -- of the shared module unresolved. Thus we have to resolve them
357 -- explicitely with loadbind. The new module is loaded, then we
358 -- resolve its symbols using the list of already loaded modules
359 -- (only those that belong to the python executable). Get these
360 -- with loadquery(L_GETINFO).
361 */
362 {
363 static void *staticmodlistptr = NULL;
364
365 if (!staticmodlistptr)
366 if (aix_getoldmodules(&staticmodlistptr) == -1)
367 return NULL;
368 p = (dl_funcptr) load(pathname, L_NOAUTODEFER, 0);
369 if (p == NULL) {
370 aix_loaderror(pathname);
371 return NULL;
372 }
373 if (aix_bindnewmodule((void *)p, staticmodlistptr) == -1) {
374 aix_loaderror(pathname);
375 return NULL;
376 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000377 }
378#endif /* _AIX */
Guido van Rossum9b38a141996-09-11 23:12:24 +0000379#ifdef MS_WIN32
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000380 {
381 HINSTANCE hDLL;
382 hDLL = LoadLibrary(pathname);
383 if (hDLL==NULL){
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000384 char errBuf[256];
385 unsigned int errorCode;
386
387 /* Get an error string from Win32 error code */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000388 char theInfo[256]; /* Pointer to error text
389 from system */
390 int theLength; /* Length of error text */
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000391
392 errorCode = GetLastError();
393
Guido van Rossum79f25d91997-04-29 20:08:16 +0000394 theLength = FormatMessage(
395 FORMAT_MESSAGE_FROM_SYSTEM, /* flags */
396 NULL, /* message source */
397 errorCode, /* the message (error) ID */
398 0, /* default language environment */
399 (LPTSTR) theInfo, /* the buffer */
400 sizeof(theInfo), /* the buffer size */
401 NULL); /* no additional format args. */
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000402
Guido van Rossum79f25d91997-04-29 20:08:16 +0000403 /* Problem: could not get the error message.
404 This should not happen if called correctly. */
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000405 if (theLength == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000406 sprintf(errBuf,
407 "DLL load failed with error code %d",
408 errorCode);
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000409 } else {
410 int len;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000411 /* For some reason a \r\n
412 is appended to the text */
413 if (theLength >= 2 &&
414 theInfo[theLength-2] == '\r' &&
415 theInfo[theLength-1] == '\n') {
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000416 theLength -= 2;
417 theInfo[theLength] = '\0';
418 }
419 strcpy(errBuf, "DLL load failed: ");
420 len = strlen(errBuf);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000421 strncpy(errBuf+len, theInfo,
422 sizeof(errBuf)-len);
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000423 errBuf[sizeof(errBuf)-1] = '\0';
424 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000425 PyErr_SetString(PyExc_ImportError, errBuf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000426 return NULL;
427 }
428 p = GetProcAddress(hDLL, funcname);
429 }
Guido van Rossum9b38a141996-09-11 23:12:24 +0000430#endif /* MS_WIN32 */
431#ifdef MS_WIN16
Guido van Rossumdadc8241996-05-23 22:51:40 +0000432 {
433 HINSTANCE hDLL;
434 hDLL = LoadLibrary(pathname);
435 if (hDLL < HINSTANCE_ERROR){
436 char errBuf[256];
Guido van Rossum79f25d91997-04-29 20:08:16 +0000437 sprintf(errBuf,
438 "DLL load failed with error code %d", hDLL);
439 PyErr_SetString(PyExc_ImportError, errBuf);
Guido van Rossumdadc8241996-05-23 22:51:40 +0000440 return NULL;
441 }
442 p = GetProcAddress(hDLL, funcname);
443 }
Guido van Rossum9b38a141996-09-11 23:12:24 +0000444#endif /* MS_WIN16 */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000445#ifdef USE_DL
Guido van Rossum79f25d91997-04-29 20:08:16 +0000446 p = dl_loadmod(Py_GetProgramName(), pathname, funcname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000447#endif /* USE_DL */
448#ifdef USE_RLD
449 {
450 NXStream *errorStream;
451 struct mach_header *new_header;
452 const char *filenames[2];
453 long ret;
454 unsigned long ptr;
455
456 errorStream = NXOpenMemory(NULL, 0, NX_WRITEONLY);
457 filenames[0] = pathname;
458 filenames[1] = NULL;
459 ret = rld_load(errorStream, &new_header,
460 filenames, NULL);
461
462 /* extract the error messages for the exception */
463 if(!ret) {
464 char *streamBuf;
465 int len, maxLen;
466
467 NXPutc(errorStream, (char)0);
468
469 NXGetMemoryBuffer(errorStream,
470 &streamBuf, &len, &maxLen);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000471 PyErr_SetString(PyExc_ImportError, streamBuf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000472 }
473
474 if(ret && rld_lookup(errorStream, funcname, &ptr))
475 p = (dl_funcptr) ptr;
476
477 NXCloseMemory(errorStream, NX_FREEBUFFER);
478
479 if(!ret)
480 return NULL;
481 }
482#endif /* USE_RLD */
483#ifdef hpux
484 {
485 shl_t lib;
486 int flags;
487
Guido van Rossum3afb5951996-12-05 23:15:35 +0000488 flags = BIND_FIRST | BIND_DEFERRED;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000489 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000490 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000491 flags = DYNAMIC_PATH | BIND_FIRST | BIND_IMMEDIATE |
492 BIND_NONFATAL | BIND_VERBOSE;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000493 printf("shl_load %s\n",pathname);
494 }
495 lib = shl_load(pathname, flags, 0);
496 if (lib == NULL)
497 {
498 char buf[256];
Guido van Rossum79f25d91997-04-29 20:08:16 +0000499 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000500 perror(pathname);
501 sprintf(buf, "Failed to load %.200s", pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000502 PyErr_SetString(PyExc_ImportError, buf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000503 return NULL;
504 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000505 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000506 printf("shl_findsym %s\n", funcname);
507 shl_findsym(&lib, funcname, TYPE_UNDEFINED, (void *) &p);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000508 if (p == NULL && Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000509 perror(funcname);
510 }
511#endif /* hpux */
Guido van Rossum644a12b1997-04-09 19:24:53 +0000512#ifdef USE_SHLIB
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000513 got_it:
Guido van Rossum644a12b1997-04-09 19:24:53 +0000514#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000515 if (p == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000516 PyErr_SetString(PyExc_ImportError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000517 "dynamic module does not define init function");
518 return NULL;
519 }
520 (*p)();
Guido van Rossum644a12b1997-04-09 19:24:53 +0000521 /* XXX Need check for err_occurred() here */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000522
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000523 m = PyDict_GetItemString(PyImport_GetModuleDict(), name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000524 if (m == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000525 if (PyErr_Occurred() == NULL)
526 PyErr_SetString(PyExc_SystemError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000527 "dynamic module not initialized properly");
528 return NULL;
529 }
Guido van Rossum1e612491996-08-19 22:12:10 +0000530 /* Remember the filename as the __file__ attribute */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000531 d = PyModule_GetDict(m);
532 s = PyString_FromString(pathname);
533 if (s == NULL || PyDict_SetItemString(d, "__file__", s) != 0)
534 PyErr_Clear(); /* Not important enough to report */
535 Py_XDECREF(s);
536 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000537 fprintf(stderr,
538 "import %s # dynamically loaded from %s\n",
539 name, pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000540 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000541 return m;
542#endif /* DYNAMIC_LINK */
543}
544
545
546#ifdef _AIX
547
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000548#include <ctype.h> /* for isdigit() */
549#include <errno.h> /* for global errno */
550#include <string.h> /* for strerror() */
551#include <stdlib.h> /* for malloc(), free() */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000552
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000553typedef struct Module {
554 struct Module *next;
555 void *entry;
556} Module, *ModulePtr;
557
558static int
559aix_getoldmodules(modlistptr)
560 void **modlistptr;
561{
562 register ModulePtr modptr, prevmodptr;
563 register struct ld_info *ldiptr;
564 register char *ldibuf;
565 register int errflag, bufsize = 1024;
566 register unsigned int offset;
567
568 /*
569 -- Get the list of loaded modules into ld_info structures.
570 */
571 if ((ldibuf = malloc(bufsize)) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000572 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000573 return -1;
574 }
575 while ((errflag = loadquery(L_GETINFO, ldibuf, bufsize)) == -1
576 && errno == ENOMEM) {
577 free(ldibuf);
578 bufsize += 1024;
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 }
584 if (errflag == -1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000585 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000586 return -1;
587 }
588 /*
589 -- Make the modules list from the ld_info structures.
590 */
591 ldiptr = (struct ld_info *)ldibuf;
592 prevmodptr = NULL;
593 do {
594 if ((modptr = (ModulePtr)malloc(sizeof(Module))) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000595 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000596 while (*modlistptr) {
597 modptr = (ModulePtr)*modlistptr;
598 *modlistptr = (void *)modptr->next;
599 free(modptr);
600 }
601 return -1;
602 }
603 modptr->entry = ldiptr->ldinfo_dataorg;
604 modptr->next = NULL;
605 if (prevmodptr == NULL)
606 *modlistptr = (void *)modptr;
607 else
608 prevmodptr->next = modptr;
609 prevmodptr = modptr;
610 offset = (unsigned int)ldiptr->ldinfo_next;
611 ldiptr = (struct ld_info *)((unsigned int)ldiptr + offset);
612 } while (offset);
613 free(ldibuf);
614 return 0;
615}
616
617static int
618aix_bindnewmodule(newmoduleptr, modlistptr)
619 void *newmoduleptr;
620 void *modlistptr;
621{
622 register ModulePtr modptr;
623
624 /*
625 -- Bind the new module with the list of loaded modules.
626 */
627 for (modptr = (ModulePtr)modlistptr; modptr; modptr = modptr->next)
628 if (loadbind(0, modptr->entry, newmoduleptr) != 0)
629 return -1;
630 return 0;
631}
632
633static void
634aix_loaderror(pathname)
635 char *pathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000636{
637
Guido van Rossum236f62d1996-06-26 21:07:08 +0000638 char *message[1024], errbuf[1024];
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000639 register int i,j;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000640
641 struct errtab {
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000642 int errNo;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000643 char *errstr;
644 } load_errtab[] = {
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000645 {L_ERROR_TOOMANY, "too many errors, rest skipped."},
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000646 {L_ERROR_NOLIB, "can't load library:"},
647 {L_ERROR_UNDEF, "can't find symbol in library:"},
648 {L_ERROR_RLDBAD,
649 "RLD index out of range or bad relocation type:"},
650 {L_ERROR_FORMAT, "not a valid, executable xcoff file:"},
651 {L_ERROR_MEMBER,
652 "file not an archive or does not contain requested member:"},
653 {L_ERROR_TYPE, "symbol table mismatch:"},
Guido van Rossum236f62d1996-06-26 21:07:08 +0000654 {L_ERROR_ALIGN, "text alignment in file is wrong."},
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000655 {L_ERROR_SYSTEM, "System error:"},
656 {L_ERROR_ERRNO, NULL}
657 };
658
659#define LOAD_ERRTAB_LEN (sizeof(load_errtab)/sizeof(load_errtab[0]))
660#define ERRBUF_APPEND(s) strncat(errbuf, s, sizeof(errbuf)-strlen(errbuf)-1)
661
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000662 sprintf(errbuf, "from module %.200s ", pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000663
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000664 if (!loadquery(L_GETMESSAGES, &message[0], sizeof(message))) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000665 ERRBUF_APPEND(strerror(errno));
Guido van Rossum236f62d1996-06-26 21:07:08 +0000666 ERRBUF_APPEND("\n");
667 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000668 for(i = 0; message[i] && *message[i]; i++) {
669 int nerr = atoi(message[i]);
670 for (j=0; j<LOAD_ERRTAB_LEN ; j++) {
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000671 if (nerr == load_errtab[j].errNo && load_errtab[j].errstr)
Guido van Rossum236f62d1996-06-26 21:07:08 +0000672 ERRBUF_APPEND(load_errtab[j].errstr);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000673 }
674 while (isdigit(*message[i])) message[i]++ ;
675 ERRBUF_APPEND(message[i]);
676 ERRBUF_APPEND("\n");
677 }
678 errbuf[strlen(errbuf)-1] = '\0'; /* trim off last newline */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000679 PyErr_SetString(PyExc_ImportError, errbuf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000680 return;
681}
682
683#endif /* _AIX */