|  |  | 
|  | /* Support for dynamic loading of extension modules */ | 
|  |  | 
|  | #include <atheos/image.h> | 
|  | #include <errno.h> | 
|  |  | 
|  | #include "Python.h" | 
|  | #include "importdl.h" | 
|  |  | 
|  |  | 
|  | const struct filedescr _PyImport_DynLoadFiletab[] = { | 
|  | {".so", "rb", C_EXTENSION}, | 
|  | {"module.so", "rb", C_EXTENSION}, | 
|  | {0, 0} | 
|  | }; | 
|  |  | 
|  | dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname, | 
|  | const char *pathname, FILE *fp) | 
|  | { | 
|  | void *p; | 
|  | int lib; | 
|  | char funcname[258]; | 
|  |  | 
|  | if (Py_VerboseFlag) | 
|  | printf("load_library %s\n", pathname); | 
|  |  | 
|  | lib = load_library(pathname, 0); | 
|  | if (lib < 0) { | 
|  | char buf[512]; | 
|  | if (Py_VerboseFlag) | 
|  | perror(pathname); | 
|  | PyOS_snprintf(buf, sizeof(buf), "Failed to load %.200s: %.200s", | 
|  | pathname, strerror(errno)); | 
|  | PyErr_SetString(PyExc_ImportError, buf); | 
|  | return NULL; | 
|  | } | 
|  | PyOS_snprintf(funcname, sizeof(funcname), "init%.200s", shortname); | 
|  | if (Py_VerboseFlag) | 
|  | printf("get_symbol_address %s\n", funcname); | 
|  | if (get_symbol_address(lib, funcname, -1, &p) < 0) { | 
|  | p = NULL; | 
|  | if (Py_VerboseFlag) | 
|  | perror(funcname); | 
|  | } | 
|  |  | 
|  | return (dl_funcptr) p; | 
|  | } |