blob: 16271d633f368e3f0f39b68a0cf995b43ab9f020 [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 Rossum25e85291996-02-25 05:02:29 +000079#if defined(__NetBSD__) || defined(__FreeBSD__)
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
129#define DYNAMIC_LINK
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000130#define SHORT_EXT ".so"
131#define LONG_EXT "module.so"
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000132#include <sys/ldr.h>
133typedef void (*dl_funcptr)();
134#define _DL_FUNCPTR_DEFINED
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000135static int aix_getoldmodules(void **);
136static int aix_bindnewmodule(void *, void *);
137static void aix_loaderror(char *);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000138#endif
139
140#ifdef DYNAMIC_LINK
141
142#ifdef USE_SHLIB
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000143#include <sys/types.h>
144#include <sys/stat.h>
Guido van Rossum25e85291996-02-25 05:02:29 +0000145#if defined(__NetBSD__) || defined(__FreeBSD__)
Guido van Rossum46c76a61995-01-20 16:53:54 +0000146#include <nlist.h>
147#include <link.h>
148#else
Guido van Rossum504f4a91996-08-20 19:59:07 +0000149#ifdef HAVE_DLFCN_H
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000150#include <dlfcn.h>
Guido van Rossum46c76a61995-01-20 16:53:54 +0000151#endif
Guido van Rossum504f4a91996-08-20 19:59:07 +0000152#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000153#ifndef _DL_FUNCPTR_DEFINED
154typedef void (*dl_funcptr)();
155#endif
156#ifndef RTLD_LAZY
157#define RTLD_LAZY 1
158#endif
159#define SHORT_EXT ".so"
160#define LONG_EXT "module.so"
161#endif /* USE_SHLIB */
162
163#if defined(USE_DL) || defined(hpux)
164#include "dl.h"
165#endif
166
Jack Jansen5d9acb61995-06-14 14:54:25 +0000167#ifdef USE_MAC_DYNAMIC_LOADING
Jack Jansen0a72e8d1995-10-23 13:54:01 +0000168#include <Aliases.h>
Jack Jansen4e043731995-02-13 22:42:34 +0000169#include <CodeFragments.h>
Guido van Rossum79f25d91997-04-29 20:08:16 +0000170#ifdef SYMANTEC__CFM68K__ /* Really an older version of Universal Headers */
Guido van Rossum6a75d261995-02-18 14:51:15 +0000171#define CFragConnectionID ConnectionID
172#define kLoadCFrag 0x01
173#endif
Jack Jansen4e043731995-02-13 22:42:34 +0000174#include <Files.h>
175#include "macdefs.h"
176#include "macglue.h"
177#endif
178
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000179#ifdef USE_RLD
180#include <mach-o/rld.h>
181#define FUNCNAME_PATTERN "_init%.200s"
182#ifndef _DL_FUNCPTR_DEFINED
183typedef void (*dl_funcptr)();
184#endif
185#endif /* USE_RLD */
186
Guido van Rossum79f25d91997-04-29 20:08:16 +0000187extern char *Py_GetProgramName();
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000188
189#ifndef FUNCNAME_PATTERN
Guido van Rossum25e85291996-02-25 05:02:29 +0000190#if defined(__hp9000s300) || defined(__NetBSD__) || defined(__FreeBSD__) || defined(__BORLANDC__)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000191#define FUNCNAME_PATTERN "_init%.200s"
192#else
193#define FUNCNAME_PATTERN "init%.200s"
194#endif
195#endif
196
197#if !defined(SHORT_EXT) && !defined(LONG_EXT)
198#define SHORT_EXT ".o"
199#define LONG_EXT "module.o"
200#endif /* !SHORT_EXT && !LONG_EXT */
201
202#endif /* DYNAMIC_LINK */
203
Guido van Rossum6a75d261995-02-18 14:51:15 +0000204/* Max length of module suffix searched for -- accommodates "module.slb" */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000205#ifndef MAXSUFFIXSIZE
Jack Jansen4e043731995-02-13 22:42:34 +0000206#define MAXSUFFIXSIZE 12
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000207#endif
208
209/* Pass it on to import.c */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000210int _PyImport_MaxSuffixSize = MAXSUFFIXSIZE;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000211
Guido van Rossum79f25d91997-04-29 20:08:16 +0000212struct filedescr _PyImport_Filetab[] = {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000213#ifdef SHORT_EXT
214 {SHORT_EXT, "rb", C_EXTENSION},
215#endif /* !SHORT_EXT */
216#ifdef LONG_EXT
217 {LONG_EXT, "rb", C_EXTENSION},
218#endif /* !LONG_EXT */
219 {".py", "r", PY_SOURCE},
220 {".pyc", "rb", PY_COMPILED},
221 {0, 0}
222};
223
Guido van Rossum38234201996-07-31 17:55:19 +0000224#ifdef NO_DYNAMIC_LINK
225#undef DYNAMIC_LINK
226#endif
227
Guido van Rossum79f25d91997-04-29 20:08:16 +0000228PyObject *
229_PyImport_LoadDynamicModule(name, pathname, fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000230 char *name;
231 char *pathname;
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000232 FILE *fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000233{
234#ifndef DYNAMIC_LINK
Guido van Rossum79f25d91997-04-29 20:08:16 +0000235 PyErr_SetString(PyExc_ImportError,
236 "dynamically linked modules not supported");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000237 return NULL;
238#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000239 PyObject *m, *d, *s;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000240 char funcname[258];
241 dl_funcptr p = NULL;
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000242#ifdef USE_SHLIB
243 static struct {
244 dev_t dev;
245 ino_t ino;
246 void *handle;
247 } handles[128];
248 static int nhandles = 0;
Guido van Rossum0bbf2531996-08-09 20:55:05 +0000249 char pathbuf[260];
250 if (strchr(pathname, '/') == NULL) {
251 /* Prefix bare filename with "./" */
252 sprintf(pathbuf, "./%-.255s", pathname);
253 pathname = pathbuf;
254 }
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000255#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000256 sprintf(funcname, FUNCNAME_PATTERN, name);
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000257#ifdef USE_SHLIB
258 if (fp != NULL) {
259 int i;
260 struct stat statb;
261 fstat(fileno(fp), &statb);
262 for (i = 0; i < nhandles; i++) {
263 if (statb.st_dev == handles[i].dev &&
264 statb.st_ino == handles[i].ino) {
265 p = (dl_funcptr) dlsym(handles[i].handle,
266 funcname);
267 goto got_it;
268 }
269 }
270 if (nhandles < 128) {
271 handles[nhandles].dev = statb.st_dev;
272 handles[nhandles].ino = statb.st_ino;
273 }
274 }
275#endif /* USE_SHLIB */
Jack Jansen5d9acb61995-06-14 14:54:25 +0000276#ifdef USE_MAC_DYNAMIC_LOADING
277 /*
Guido van Rossum79f25d91997-04-29 20:08:16 +0000278 ** Dynamic loading of CFM shared libraries on the Mac. The
279 ** code has become more convoluted than it was, because we
280 ** want to be able to put multiple modules in a single
281 ** file. For this reason, we have to determine the fragment
282 ** name, and we cannot use the library entry point but we have
283 ** to locate the correct init routine "by hand".
Jack Jansen5d9acb61995-06-14 14:54:25 +0000284 */
Jack Jansen4e043731995-02-13 22:42:34 +0000285 {
286 FSSpec libspec;
287 CFragConnectionID connID;
Guido van Rossum6a75d261995-02-18 14:51:15 +0000288 Ptr mainAddr;
289 Str255 errMessage;
290 OSErr err;
Jack Jansen5d9acb61995-06-14 14:54:25 +0000291 Boolean isfolder, didsomething;
292 char buf[512];
293 Str63 fragname;
294 Ptr symAddr;
295 CFragSymbolClass class;
Jack Jansen4e043731995-02-13 22:42:34 +0000296
Jack Jansen5d9acb61995-06-14 14:54:25 +0000297 /* First resolve any aliases to find the real file */
Jack Jansen4e043731995-02-13 22:42:34 +0000298 (void)FSMakeFSSpec(0, 0, Pstring(pathname), &libspec);
Jack Jansen5d9acb61995-06-14 14:54:25 +0000299 err = ResolveAliasFile(&libspec, 1, &isfolder, &didsomething);
300 if ( err ) {
301 sprintf(buf, "%s: %s", 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 Rossum79f25d91997-04-29 20:08:16 +0000321 sprintf(buf, "%.*s: %s", errMessage[0], errMessage+1,
322 PyMac_StrError(err));
323 PyErr_SetString(PyExc_ImportError, buf);
Jack Jansen4e043731995-02-13 22:42:34 +0000324 return NULL;
325 }
Jack Jansen5d9acb61995-06-14 14:54:25 +0000326 /* Locate the address of the correct init function */
327 err = FindSymbol(connID, Pstring(funcname), &symAddr, &class);
328 if ( err ) {
329 sprintf(buf, "%s: %s", 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 Rossum644a12b1997-04-09 19:24:53 +0000525 /* XXX Need check for err_occurred() here */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000526
Guido van Rossum79f25d91997-04-29 20:08:16 +0000527 m = PyDict_GetItemString(import_modules, name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000528 if (m == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000529 if (PyErr_Occurred() == NULL)
530 PyErr_SetString(PyExc_SystemError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000531 "dynamic module not initialized properly");
532 return NULL;
533 }
Guido van Rossum1e612491996-08-19 22:12:10 +0000534 /* Remember the filename as the __file__ attribute */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000535 d = PyModule_GetDict(m);
536 s = PyString_FromString(pathname);
537 if (s == NULL || PyDict_SetItemString(d, "__file__", s) != 0)
538 PyErr_Clear(); /* Not important enough to report */
539 Py_XDECREF(s);
540 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000541 fprintf(stderr,
542 "import %s # dynamically loaded from %s\n",
543 name, pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000544 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000545 return m;
546#endif /* DYNAMIC_LINK */
547}
548
549
550#ifdef _AIX
551
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000552#include <ctype.h> /* for isdigit() */
553#include <errno.h> /* for global errno */
554#include <string.h> /* for strerror() */
555#include <stdlib.h> /* for malloc(), free() */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000556
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000557typedef struct Module {
558 struct Module *next;
559 void *entry;
560} Module, *ModulePtr;
561
562static int
563aix_getoldmodules(modlistptr)
564 void **modlistptr;
565{
566 register ModulePtr modptr, prevmodptr;
567 register struct ld_info *ldiptr;
568 register char *ldibuf;
569 register int errflag, bufsize = 1024;
570 register unsigned int offset;
571
572 /*
573 -- Get the list of loaded modules into ld_info structures.
574 */
575 if ((ldibuf = malloc(bufsize)) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000576 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000577 return -1;
578 }
579 while ((errflag = loadquery(L_GETINFO, ldibuf, bufsize)) == -1
580 && errno == ENOMEM) {
581 free(ldibuf);
582 bufsize += 1024;
583 if ((ldibuf = malloc(bufsize)) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000584 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000585 return -1;
586 }
587 }
588 if (errflag == -1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000589 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000590 return -1;
591 }
592 /*
593 -- Make the modules list from the ld_info structures.
594 */
595 ldiptr = (struct ld_info *)ldibuf;
596 prevmodptr = NULL;
597 do {
598 if ((modptr = (ModulePtr)malloc(sizeof(Module))) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000599 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000600 while (*modlistptr) {
601 modptr = (ModulePtr)*modlistptr;
602 *modlistptr = (void *)modptr->next;
603 free(modptr);
604 }
605 return -1;
606 }
607 modptr->entry = ldiptr->ldinfo_dataorg;
608 modptr->next = NULL;
609 if (prevmodptr == NULL)
610 *modlistptr = (void *)modptr;
611 else
612 prevmodptr->next = modptr;
613 prevmodptr = modptr;
614 offset = (unsigned int)ldiptr->ldinfo_next;
615 ldiptr = (struct ld_info *)((unsigned int)ldiptr + offset);
616 } while (offset);
617 free(ldibuf);
618 return 0;
619}
620
621static int
622aix_bindnewmodule(newmoduleptr, modlistptr)
623 void *newmoduleptr;
624 void *modlistptr;
625{
626 register ModulePtr modptr;
627
628 /*
629 -- Bind the new module with the list of loaded modules.
630 */
631 for (modptr = (ModulePtr)modlistptr; modptr; modptr = modptr->next)
632 if (loadbind(0, modptr->entry, newmoduleptr) != 0)
633 return -1;
634 return 0;
635}
636
637static void
638aix_loaderror(pathname)
639 char *pathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000640{
641
Guido van Rossum236f62d1996-06-26 21:07:08 +0000642 char *message[1024], errbuf[1024];
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000643 register int i,j;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000644
645 struct errtab {
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000646 int errNo;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000647 char *errstr;
648 } load_errtab[] = {
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000649 {L_ERROR_TOOMANY, "too many errors, rest skipped."},
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000650 {L_ERROR_NOLIB, "can't load library:"},
651 {L_ERROR_UNDEF, "can't find symbol in library:"},
652 {L_ERROR_RLDBAD,
653 "RLD index out of range or bad relocation type:"},
654 {L_ERROR_FORMAT, "not a valid, executable xcoff file:"},
655 {L_ERROR_MEMBER,
656 "file not an archive or does not contain requested member:"},
657 {L_ERROR_TYPE, "symbol table mismatch:"},
Guido van Rossum236f62d1996-06-26 21:07:08 +0000658 {L_ERROR_ALIGN, "text alignment in file is wrong."},
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000659 {L_ERROR_SYSTEM, "System error:"},
660 {L_ERROR_ERRNO, NULL}
661 };
662
663#define LOAD_ERRTAB_LEN (sizeof(load_errtab)/sizeof(load_errtab[0]))
664#define ERRBUF_APPEND(s) strncat(errbuf, s, sizeof(errbuf)-strlen(errbuf)-1)
665
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000666 sprintf(errbuf, "from module %.200s ", pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000667
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000668 if (!loadquery(L_GETMESSAGES, &message[0], sizeof(message))) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000669 ERRBUF_APPEND(strerror(errno));
Guido van Rossum236f62d1996-06-26 21:07:08 +0000670 ERRBUF_APPEND("\n");
671 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000672 for(i = 0; message[i] && *message[i]; i++) {
673 int nerr = atoi(message[i]);
674 for (j=0; j<LOAD_ERRTAB_LEN ; j++) {
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000675 if (nerr == load_errtab[j].errNo && load_errtab[j].errstr)
Guido van Rossum236f62d1996-06-26 21:07:08 +0000676 ERRBUF_APPEND(load_errtab[j].errstr);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000677 }
678 while (isdigit(*message[i])) message[i]++ ;
679 ERRBUF_APPEND(message[i]);
680 ERRBUF_APPEND("\n");
681 }
682 errbuf[strlen(errbuf)-1] = '\0'; /* trim off last newline */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000683 PyErr_SetString(PyExc_ImportError, errbuf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000684 return;
685}
686
687#endif /* _AIX */