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 "_init%.200s"
12#else
13#define FUNCNAME_PATTERN "init%.200s"
14#endif
15
16const struct filedescr _PyImport_DynLoadFiletab[] = {
17    {SHLIB_EXT, "rb", C_EXTENSION},
18    {"module"SHLIB_EXT, "rb", C_EXTENSION},
19    {0, 0}
20};
21
22dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname,
23                                    const char *pathname, FILE *fp)
24{
25    dl_funcptr p;
26    shl_t lib;
27    int flags;
28    char funcname[258];
29
30    flags = BIND_FIRST | BIND_DEFERRED;
31    if (Py_VerboseFlag) {
32        flags = BIND_FIRST | BIND_IMMEDIATE |
33            BIND_NONFATAL | BIND_VERBOSE;
34        printf("shl_load %s\n",pathname);
35    }
36    lib = shl_load(pathname, flags, 0);
37    /* XXX Chuck Blake once wrote that 0 should be BIND_NOSTART? */
38    if (lib == NULL) {
39        char buf[256];
40        if (Py_VerboseFlag)
41            perror(pathname);
42        PyOS_snprintf(buf, sizeof(buf), "Failed to load %.200s",
43                      pathname);
44        PyErr_SetString(PyExc_ImportError, buf);
45        return NULL;
46    }
47    PyOS_snprintf(funcname, sizeof(funcname), FUNCNAME_PATTERN, shortname);
48    if (Py_VerboseFlag)
49        printf("shl_findsym %s\n", funcname);
50    if (shl_findsym(&lib, funcname, TYPE_UNDEFINED, (void *) &p) == -1) {
51        shl_unload(lib);
52        p = NULL;
53    }
54    if (p == NULL && Py_VerboseFlag)
55        perror(funcname);
56
57    return p;
58}
59