blob: 6b3eccc98fecbb32681981f947ef78fac5b726aa [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 "importdl.h"
37
Guido van Rossum1ae940a1995-01-02 19:04:15 +000038/* Explanation of some of the the various #defines used by dynamic linking...
39
40 symbol -- defined for:
41
Guido van Rossum6ea90921999-12-20 21:20:42 +000042 HAVE_DYNAMIC_LOADING -- any kind of dynamic linking (from ./configure)
Guido van Rossum1ae940a1995-01-02 19:04:15 +000043 USE_SHLIB -- SunOS or IRIX 5 (SVR4?) shared libraries
44 _AIX -- AIX style dynamic linking
Guido van Rossum15af20a1998-01-19 22:03:52 +000045 __NetBSD__ -- NetBSD shared libraries
46 (assuming dlerror() was introduced between 1.2 and 1.3)
Guido van Rossum1a8791e1998-08-04 22:46:29 +000047 __BEOS__ -- BeOS shared libraries - defined by the compiler
Guido van Rossum1ae940a1995-01-02 19:04:15 +000048*/
49
50/* Configure dynamic linking */
51
Guido van Rossum6ea90921999-12-20 21:20:42 +000052#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossumff4af061996-01-12 01:17:50 +000053
Guido van Rossum6ea90921999-12-20 21:20:42 +000054extern dl_funcptr _PyImport_GetDynLoadFunc(const char *name,
55 const char *funcname,
56 const char *pathname, FILE *fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000057
Guido van Rossum6ea90921999-12-20 21:20:42 +000058/* ### given NeXT, is WITH_DYLD not necessary? */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000059
Guido van Rossum6ea90921999-12-20 21:20:42 +000060#if defined(__hp9000s300) || (defined(__NetBSD__) || defined(__FreeBSD__)) && !defined(__ELF__) || defined(__OpenBSD__) || defined(__BORLANDC__) || defined(NeXT) || defined(WITH_DYLD)
Guido van Rossum1ae940a1995-01-02 19:04:15 +000061#define FUNCNAME_PATTERN "_init%.200s"
62#else
63#define FUNCNAME_PATTERN "init%.200s"
64#endif
Guido van Rossum6ea90921999-12-20 21:20:42 +000065
66/* ### temporary, for setting USE_SHLIB */
67#if defined(__NetBSD__) && (NetBSD < 199712)
68#define USE_SHLIB
69#else
70#if defined(HAVE_DLOPEN) || defined(M_UNIX)
71#define USE_SHLIB
72#endif
73#endif
74#ifdef _AIX
75#undef USE_SHLIB
76#endif
77#ifdef __BEOS__
78#undef USE_SHLIB
Guido van Rossum1ae940a1995-01-02 19:04:15 +000079#endif
80
Guido van Rossum6ea90921999-12-20 21:20:42 +000081#endif /* HAVE_DYNAMIC_LOADING */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000082
Guido van Rossum38234201996-07-31 17:55:19 +000083#ifdef NO_DYNAMIC_LINK
Guido van Rossum6ea90921999-12-20 21:20:42 +000084#undef HAVE_DYNAMIC_LOADING
Guido van Rossum38234201996-07-31 17:55:19 +000085#endif
86
Guido van Rossum6ea90921999-12-20 21:20:42 +000087
Guido van Rossum79f25d91997-04-29 20:08:16 +000088PyObject *
89_PyImport_LoadDynamicModule(name, pathname, fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +000090 char *name;
91 char *pathname;
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +000092 FILE *fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000093{
Guido van Rossum6ea90921999-12-20 21:20:42 +000094#ifndef HAVE_DYNAMIC_LOADING
Guido van Rossum79f25d91997-04-29 20:08:16 +000095 PyErr_SetString(PyExc_ImportError,
96 "dynamically linked modules not supported");
Guido van Rossum1ae940a1995-01-02 19:04:15 +000097 return NULL;
98#else
Guido van Rossum79f25d91997-04-29 20:08:16 +000099 PyObject *m, *d, *s;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000100 char funcname[258];
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000101 char *lastdot, *shortname, *packagecontext;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000102 dl_funcptr p = NULL;
Guido van Rossum6ea90921999-12-20 21:20:42 +0000103
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000104#ifdef USE_SHLIB
Guido van Rossum0bbf2531996-08-09 20:55:05 +0000105 char pathbuf[260];
106 if (strchr(pathname, '/') == NULL) {
107 /* Prefix bare filename with "./" */
108 sprintf(pathbuf, "./%-.255s", pathname);
109 pathname = pathbuf;
110 }
Guido van Rossum6ea90921999-12-20 21:20:42 +0000111#endif /* USE_SHLIB */
112
Guido van Rossum25ce5661997-08-02 03:10:38 +0000113 if ((m = _PyImport_FindExtension(name, pathname)) != NULL) {
114 Py_INCREF(m);
115 return m;
116 }
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000117 lastdot = strrchr(name, '.');
118 if (lastdot == NULL) {
119 packagecontext = NULL;
120 shortname = name;
121 }
122 else {
123 packagecontext = name;
124 shortname = lastdot+1;
125 }
126 sprintf(funcname, FUNCNAME_PATTERN, shortname);
Guido van Rossumd5962ad1996-07-31 22:44:53 +0000127
Guido van Rossum6ea90921999-12-20 21:20:42 +0000128 p = _PyImport_GetDynLoadFunc(name, funcname, pathname, fp);
129 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000130 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000131 if (p == NULL) {
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000132 PyErr_Format(PyExc_ImportError,
Guido van Rossum42e8e5d1998-01-19 22:23:08 +0000133 "dynamic module does not define init function (%.200s)",
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000134 funcname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000135 return NULL;
136 }
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000137 _Py_PackageContext = packagecontext;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000138 (*p)();
Guido van Rossum2e58ff31997-11-19 18:53:33 +0000139 _Py_PackageContext = NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000140 if (PyErr_Occurred())
141 return NULL;
142 if (_PyImport_FixupExtension(name, pathname) == NULL)
143 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000144
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000145 m = PyDict_GetItemString(PyImport_GetModuleDict(), name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000146 if (m == NULL) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000147 PyErr_SetString(PyExc_SystemError,
148 "dynamic module not initialized properly");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000149 return NULL;
150 }
Guido van Rossum1e612491996-08-19 22:12:10 +0000151 /* Remember the filename as the __file__ attribute */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000152 d = PyModule_GetDict(m);
153 s = PyString_FromString(pathname);
154 if (s == NULL || PyDict_SetItemString(d, "__file__", s) != 0)
155 PyErr_Clear(); /* Not important enough to report */
156 Py_XDECREF(s);
157 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000158 PySys_WriteStderr(
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000159 "import %s # dynamically loaded from %s\n",
160 name, pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000161 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000162 return m;
Guido van Rossum6ea90921999-12-20 21:20:42 +0000163#endif /* HAVE_DYNAMIC_LOADING */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000164}