1 2 /* Support for dynamic loading of extension modules */ 3 4 #include "dl.h" 5 #include <errno.h> 6 7 #include "Python.h" 8 #include "importdl.h" 9 10 #if defined(__hp9000s300) 11 #define FUNCNAME_PATTERN "_%.20s_%.200s" 12 #else 13 #define FUNCNAME_PATTERN "%.20s_%.200s" 14 #endif 15 16 const char *_PyImport_DynLoadFiletab[] = {SHLIB_EXT, NULL}; 17 18 dl_funcptr _PyImport_FindSharedFuncptr(const char *prefix, 19 const char *shortname, 20 const char *pathname, FILE *fp) 21 { 22 dl_funcptr p; 23 shl_t lib; 24 int flags; 25 char funcname[258]; 26 27 flags = BIND_FIRST | BIND_DEFERRED; 28 if (Py_VerboseFlag) { 29 flags = BIND_FIRST | BIND_IMMEDIATE | 30 BIND_NONFATAL | BIND_VERBOSE; 31 printf("shl_load %s\n",pathname); 32 } 33 lib = shl_load(pathname, flags, 0); 34 /* XXX Chuck Blake once wrote that 0 should be BIND_NOSTART? */ 35 if (lib == NULL) { 36 char buf[256]; 37 PyObject *pathname_ob = NULL; 38 PyObject *buf_ob = NULL; 39 PyObject *shortname_ob = NULL; 40 41 if (Py_VerboseFlag) 42 perror(pathname); 43 PyOS_snprintf(buf, sizeof(buf), "Failed to load %.200s", 44 pathname); 45 buf_ob = PyUnicode_FromString(buf); 46 shortname_ob = PyUnicode_FromString(shortname); 47 pathname_ob = PyUnicode_FromString(pathname); 48 PyErr_SetImportError(buf_ob, shortname_ob, pathname_ob); 49 Py_DECREF(buf_ob); 50 Py_DECREF(shortname_ob); 51 Py_DECREF(pathname_ob); 52 return NULL; 53 } 54 PyOS_snprintf(funcname, sizeof(funcname), FUNCNAME_PATTERN, 55 prefix, shortname); 56 if (Py_VerboseFlag) 57 printf("shl_findsym %s\n", funcname); 58 if (shl_findsym(&lib, funcname, TYPE_UNDEFINED, (void *) &p) == -1) { 59 shl_unload(lib); 60 p = NULL; 61 } 62 if (p == NULL && Py_VerboseFlag) 63 perror(funcname); 64 65 return p; 66 } 67