blob: 436a8de53372b8b8487cf46a52563114946502a6 [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
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 Rossum9218b701997-05-05 15:03:26 +0000145#if defined(__NetBSD__)
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 ) {
Guido van Rossumbc2472d1997-04-30 19:07:54 +0000301 sprintf(buf, "%.255s: %.200s",
302 pathname, PyMac_StrError(err));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000303 PyErr_SetString(PyExc_ImportError, buf);
Jack Jansen5d9acb61995-06-14 14:54:25 +0000304 return NULL;
305 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000306 /* Next, determine the fragment name,
307 by stripping '.slb' and 'module' */
Jack Jansen5d9acb61995-06-14 14:54:25 +0000308 memcpy(fragname+1, libspec.name+1, libspec.name[0]);
309 fragname[0] = libspec.name[0];
Guido van Rossum79f25d91997-04-29 20:08:16 +0000310 if( strncmp((char *)(fragname+1+fragname[0]-4),
311 ".slb", 4) == 0 )
Jack Jansen5d9acb61995-06-14 14:54:25 +0000312 fragname[0] -= 4;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000313 if ( strncmp((char *)(fragname+1+fragname[0]-6),
314 "module", 6) == 0 )
Jack Jansen5d9acb61995-06-14 14:54:25 +0000315 fragname[0] -= 6;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000316 /* Load the fragment
317 (or return the connID if it is already loaded */
Jack Jansen5d9acb61995-06-14 14:54:25 +0000318 err = GetDiskFragment(&libspec, 0, 0, fragname,
Guido van Rossum6a75d261995-02-18 14:51:15 +0000319 kLoadCFrag, &connID, &mainAddr,
320 errMessage);
Jack Jansen4e043731995-02-13 22:42:34 +0000321 if ( err ) {
Guido van Rossumbc2472d1997-04-30 19:07:54 +0000322 sprintf(buf, "%.*s: %.200s",
323 errMessage[0], errMessage+1,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000324 PyMac_StrError(err));
325 PyErr_SetString(PyExc_ImportError, buf);
Jack Jansen4e043731995-02-13 22:42:34 +0000326 return NULL;
327 }
Jack Jansen5d9acb61995-06-14 14:54:25 +0000328 /* Locate the address of the correct init function */
329 err = FindSymbol(connID, Pstring(funcname), &symAddr, &class);
330 if ( err ) {
Guido van Rossumbc2472d1997-04-30 19:07:54 +0000331 sprintf(buf, "%s: %.200s",
332 funcname, PyMac_StrError(err));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000333 PyErr_SetString(PyExc_ImportError, buf);
Jack Jansen5d9acb61995-06-14 14:54:25 +0000334 return NULL;
335 }
336 p = (dl_funcptr)symAddr;
Jack Jansen4e043731995-02-13 22:42:34 +0000337 }
Jack Jansen5d9acb61995-06-14 14:54:25 +0000338#endif /* USE_MAC_DYNAMIC_LOADING */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000339#ifdef USE_SHLIB
340 {
341#ifdef RTLD_NOW
342 /* RTLD_NOW: resolve externals now
343 (i.e. core dump now if some are missing) */
344 void *handle = dlopen(pathname, RTLD_NOW);
345#else
346 void *handle;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000347 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000348 printf("dlopen(\"%s\", %d);\n", pathname, RTLD_LAZY);
349 handle = dlopen(pathname, RTLD_LAZY);
350#endif /* RTLD_NOW */
351 if (handle == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000352 PyErr_SetString(PyExc_ImportError, dlerror());
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000353 return NULL;
354 }
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000355 if (fp != NULL && nhandles < 128)
356 handles[nhandles++].handle = handle;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000357 p = (dl_funcptr) dlsym(handle, funcname);
358 }
359#endif /* USE_SHLIB */
360#ifdef _AIX
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000361 /*
362 -- Invoke load() with L_NOAUTODEFER leaving the imported symbols
363 -- of the shared module unresolved. Thus we have to resolve them
364 -- explicitely with loadbind. The new module is loaded, then we
365 -- resolve its symbols using the list of already loaded modules
366 -- (only those that belong to the python executable). Get these
367 -- with loadquery(L_GETINFO).
368 */
369 {
370 static void *staticmodlistptr = NULL;
371
372 if (!staticmodlistptr)
373 if (aix_getoldmodules(&staticmodlistptr) == -1)
374 return NULL;
375 p = (dl_funcptr) load(pathname, L_NOAUTODEFER, 0);
376 if (p == NULL) {
377 aix_loaderror(pathname);
378 return NULL;
379 }
380 if (aix_bindnewmodule((void *)p, staticmodlistptr) == -1) {
381 aix_loaderror(pathname);
382 return NULL;
383 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000384 }
385#endif /* _AIX */
Guido van Rossum9b38a141996-09-11 23:12:24 +0000386#ifdef MS_WIN32
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000387 {
388 HINSTANCE hDLL;
389 hDLL = LoadLibrary(pathname);
390 if (hDLL==NULL){
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000391 char errBuf[256];
392 unsigned int errorCode;
393
394 /* Get an error string from Win32 error code */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000395 char theInfo[256]; /* Pointer to error text
396 from system */
397 int theLength; /* Length of error text */
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000398
399 errorCode = GetLastError();
400
Guido van Rossum79f25d91997-04-29 20:08:16 +0000401 theLength = FormatMessage(
402 FORMAT_MESSAGE_FROM_SYSTEM, /* flags */
403 NULL, /* message source */
404 errorCode, /* the message (error) ID */
405 0, /* default language environment */
406 (LPTSTR) theInfo, /* the buffer */
407 sizeof(theInfo), /* the buffer size */
408 NULL); /* no additional format args. */
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000409
Guido van Rossum79f25d91997-04-29 20:08:16 +0000410 /* Problem: could not get the error message.
411 This should not happen if called correctly. */
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000412 if (theLength == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000413 sprintf(errBuf,
414 "DLL load failed with error code %d",
415 errorCode);
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000416 } else {
417 int len;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000418 /* For some reason a \r\n
419 is appended to the text */
420 if (theLength >= 2 &&
421 theInfo[theLength-2] == '\r' &&
422 theInfo[theLength-1] == '\n') {
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000423 theLength -= 2;
424 theInfo[theLength] = '\0';
425 }
426 strcpy(errBuf, "DLL load failed: ");
427 len = strlen(errBuf);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000428 strncpy(errBuf+len, theInfo,
429 sizeof(errBuf)-len);
Guido van Rossum11a3f0c21995-07-18 14:40:09 +0000430 errBuf[sizeof(errBuf)-1] = '\0';
431 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000432 PyErr_SetString(PyExc_ImportError, errBuf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000433 return NULL;
434 }
435 p = GetProcAddress(hDLL, funcname);
436 }
Guido van Rossum9b38a141996-09-11 23:12:24 +0000437#endif /* MS_WIN32 */
438#ifdef MS_WIN16
Guido van Rossumdadc8241996-05-23 22:51:40 +0000439 {
440 HINSTANCE hDLL;
441 hDLL = LoadLibrary(pathname);
442 if (hDLL < HINSTANCE_ERROR){
443 char errBuf[256];
Guido van Rossum79f25d91997-04-29 20:08:16 +0000444 sprintf(errBuf,
445 "DLL load failed with error code %d", hDLL);
446 PyErr_SetString(PyExc_ImportError, errBuf);
Guido van Rossumdadc8241996-05-23 22:51:40 +0000447 return NULL;
448 }
449 p = GetProcAddress(hDLL, funcname);
450 }
Guido van Rossum9b38a141996-09-11 23:12:24 +0000451#endif /* MS_WIN16 */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000452#ifdef USE_DL
Guido van Rossum79f25d91997-04-29 20:08:16 +0000453 p = dl_loadmod(Py_GetProgramName(), pathname, funcname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000454#endif /* USE_DL */
455#ifdef USE_RLD
456 {
457 NXStream *errorStream;
458 struct mach_header *new_header;
459 const char *filenames[2];
460 long ret;
461 unsigned long ptr;
462
463 errorStream = NXOpenMemory(NULL, 0, NX_WRITEONLY);
464 filenames[0] = pathname;
465 filenames[1] = NULL;
466 ret = rld_load(errorStream, &new_header,
467 filenames, NULL);
468
469 /* extract the error messages for the exception */
470 if(!ret) {
471 char *streamBuf;
472 int len, maxLen;
473
474 NXPutc(errorStream, (char)0);
475
476 NXGetMemoryBuffer(errorStream,
477 &streamBuf, &len, &maxLen);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000478 PyErr_SetString(PyExc_ImportError, streamBuf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000479 }
480
481 if(ret && rld_lookup(errorStream, funcname, &ptr))
482 p = (dl_funcptr) ptr;
483
484 NXCloseMemory(errorStream, NX_FREEBUFFER);
485
486 if(!ret)
487 return NULL;
488 }
489#endif /* USE_RLD */
490#ifdef hpux
491 {
492 shl_t lib;
493 int flags;
494
Guido van Rossum3afb5951996-12-05 23:15:35 +0000495 flags = BIND_FIRST | BIND_DEFERRED;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000496 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000497 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000498 flags = DYNAMIC_PATH | BIND_FIRST | BIND_IMMEDIATE |
499 BIND_NONFATAL | BIND_VERBOSE;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000500 printf("shl_load %s\n",pathname);
501 }
502 lib = shl_load(pathname, flags, 0);
503 if (lib == NULL)
504 {
505 char buf[256];
Guido van Rossum79f25d91997-04-29 20:08:16 +0000506 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000507 perror(pathname);
508 sprintf(buf, "Failed to load %.200s", pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000509 PyErr_SetString(PyExc_ImportError, buf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000510 return NULL;
511 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000512 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000513 printf("shl_findsym %s\n", funcname);
514 shl_findsym(&lib, funcname, TYPE_UNDEFINED, (void *) &p);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000515 if (p == NULL && Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000516 perror(funcname);
517 }
518#endif /* hpux */
Guido van Rossum644a12b1997-04-09 19:24:53 +0000519#ifdef USE_SHLIB
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000520 got_it:
Guido van Rossum644a12b1997-04-09 19:24:53 +0000521#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000522 if (p == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000523 PyErr_SetString(PyExc_ImportError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000524 "dynamic module does not define init function");
525 return NULL;
526 }
527 (*p)();
Guido van Rossum644a12b1997-04-09 19:24:53 +0000528 /* XXX Need check for err_occurred() here */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000529
Guido van Rossumaf5dfb41997-05-14 17:36:12 +0000530 m = PyDict_GetItemString(_PyImport_Modules, name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000531 if (m == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000532 if (PyErr_Occurred() == NULL)
533 PyErr_SetString(PyExc_SystemError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000534 "dynamic module not initialized properly");
535 return NULL;
536 }
Guido van Rossum1e612491996-08-19 22:12:10 +0000537 /* Remember the filename as the __file__ attribute */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000538 d = PyModule_GetDict(m);
539 s = PyString_FromString(pathname);
540 if (s == NULL || PyDict_SetItemString(d, "__file__", s) != 0)
541 PyErr_Clear(); /* Not important enough to report */
542 Py_XDECREF(s);
543 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000544 fprintf(stderr,
545 "import %s # dynamically loaded from %s\n",
546 name, pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000547 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000548 return m;
549#endif /* DYNAMIC_LINK */
550}
551
552
553#ifdef _AIX
554
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000555#include <ctype.h> /* for isdigit() */
556#include <errno.h> /* for global errno */
557#include <string.h> /* for strerror() */
558#include <stdlib.h> /* for malloc(), free() */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000559
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000560typedef struct Module {
561 struct Module *next;
562 void *entry;
563} Module, *ModulePtr;
564
565static int
566aix_getoldmodules(modlistptr)
567 void **modlistptr;
568{
569 register ModulePtr modptr, prevmodptr;
570 register struct ld_info *ldiptr;
571 register char *ldibuf;
572 register int errflag, bufsize = 1024;
573 register unsigned int offset;
574
575 /*
576 -- Get the list of loaded modules into ld_info structures.
577 */
578 if ((ldibuf = malloc(bufsize)) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000579 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000580 return -1;
581 }
582 while ((errflag = loadquery(L_GETINFO, ldibuf, bufsize)) == -1
583 && errno == ENOMEM) {
584 free(ldibuf);
585 bufsize += 1024;
586 if ((ldibuf = malloc(bufsize)) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000587 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000588 return -1;
589 }
590 }
591 if (errflag == -1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000592 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000593 return -1;
594 }
595 /*
596 -- Make the modules list from the ld_info structures.
597 */
598 ldiptr = (struct ld_info *)ldibuf;
599 prevmodptr = NULL;
600 do {
601 if ((modptr = (ModulePtr)malloc(sizeof(Module))) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000602 PyErr_SetString(PyExc_ImportError, strerror(errno));
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000603 while (*modlistptr) {
604 modptr = (ModulePtr)*modlistptr;
605 *modlistptr = (void *)modptr->next;
606 free(modptr);
607 }
608 return -1;
609 }
610 modptr->entry = ldiptr->ldinfo_dataorg;
611 modptr->next = NULL;
612 if (prevmodptr == NULL)
613 *modlistptr = (void *)modptr;
614 else
615 prevmodptr->next = modptr;
616 prevmodptr = modptr;
617 offset = (unsigned int)ldiptr->ldinfo_next;
618 ldiptr = (struct ld_info *)((unsigned int)ldiptr + offset);
619 } while (offset);
620 free(ldibuf);
621 return 0;
622}
623
624static int
625aix_bindnewmodule(newmoduleptr, modlistptr)
626 void *newmoduleptr;
627 void *modlistptr;
628{
629 register ModulePtr modptr;
630
631 /*
632 -- Bind the new module with the list of loaded modules.
633 */
634 for (modptr = (ModulePtr)modlistptr; modptr; modptr = modptr->next)
635 if (loadbind(0, modptr->entry, newmoduleptr) != 0)
636 return -1;
637 return 0;
638}
639
640static void
641aix_loaderror(pathname)
642 char *pathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000643{
644
Guido van Rossum236f62d1996-06-26 21:07:08 +0000645 char *message[1024], errbuf[1024];
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000646 register int i,j;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000647
648 struct errtab {
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000649 int errNo;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000650 char *errstr;
651 } load_errtab[] = {
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000652 {L_ERROR_TOOMANY, "too many errors, rest skipped."},
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000653 {L_ERROR_NOLIB, "can't load library:"},
654 {L_ERROR_UNDEF, "can't find symbol in library:"},
655 {L_ERROR_RLDBAD,
656 "RLD index out of range or bad relocation type:"},
657 {L_ERROR_FORMAT, "not a valid, executable xcoff file:"},
658 {L_ERROR_MEMBER,
659 "file not an archive or does not contain requested member:"},
660 {L_ERROR_TYPE, "symbol table mismatch:"},
Guido van Rossum236f62d1996-06-26 21:07:08 +0000661 {L_ERROR_ALIGN, "text alignment in file is wrong."},
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000662 {L_ERROR_SYSTEM, "System error:"},
663 {L_ERROR_ERRNO, NULL}
664 };
665
666#define LOAD_ERRTAB_LEN (sizeof(load_errtab)/sizeof(load_errtab[0]))
667#define ERRBUF_APPEND(s) strncat(errbuf, s, sizeof(errbuf)-strlen(errbuf)-1)
668
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000669 sprintf(errbuf, "from module %.200s ", pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000670
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000671 if (!loadquery(L_GETMESSAGES, &message[0], sizeof(message))) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000672 ERRBUF_APPEND(strerror(errno));
Guido van Rossum236f62d1996-06-26 21:07:08 +0000673 ERRBUF_APPEND("\n");
674 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000675 for(i = 0; message[i] && *message[i]; i++) {
676 int nerr = atoi(message[i]);
677 for (j=0; j<LOAD_ERRTAB_LEN ; j++) {
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000678 if (nerr == load_errtab[j].errNo && load_errtab[j].errstr)
Guido van Rossum236f62d1996-06-26 21:07:08 +0000679 ERRBUF_APPEND(load_errtab[j].errstr);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000680 }
681 while (isdigit(*message[i])) message[i]++ ;
682 ERRBUF_APPEND(message[i]);
683 ERRBUF_APPEND("\n");
684 }
685 errbuf[strlen(errbuf)-1] = '\0'; /* trim off last newline */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000686 PyErr_SetString(PyExc_ImportError, errbuf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000687 return;
688}
689
690#endif /* _AIX */