2 /* Support for dynamic loading of extension modules */
8 #include <CodeFragments.h>
10 #include "TFileSpec.h" /* for Path2FSSpec() */
13 #include <TextUtils.h>
18 const struct filedescr _PyImport_DynLoadFiletab
[] = {
19 {".slb", "rb", C_EXTENSION
},
20 {".carbon.slb", "rb", C_EXTENSION
},
25 dl_funcptr
_PyImport_GetDynLoadFunc(const char *fqname
, const char *shortname
,
26 const char *pathname
, FILE *fp
)
32 ** Dynamic loading of CFM shared libraries on the Mac. The
33 ** code has become more convoluted than it was, because we
34 ** want to be able to put multiple modules in a single
35 ** file. For this reason, we have to determine the fragment
36 ** name, and we cannot use the library entry point but we have
37 ** to locate the correct init routine "by hand".
40 CFragConnectionID connID
;
45 Boolean isfolder
, didsomething
;
50 CFragSymbolClass
class;
52 /* First resolve any aliases to find the real file */
54 err
= Path2FSSpec(pathname
, &libspec
);
56 c2pstrcpy((unsigned char *)buf
, pathname
);
57 (void)FSMakeFSSpec(0, 0, (unsigned char *)buf
, &libspec
);
58 err
= ResolveAliasFile(&libspec
, 1, &isfolder
, &didsomething
);
61 PyOS_snprintf(buf
, sizeof(buf
),
62 "%.200s: %.200s", pathname
, PyMac_StrError(err
));
63 PyErr_SetString(PyExc_ImportError
, buf
);
66 /* Next, determine the fragment name,
67 by stripping '.slb' and 'module' */
68 memcpy(fragname
+1, libspec
.name
+1, libspec
.name
[0]);
69 fragname
[0] = libspec
.name
[0];
70 if( strncmp((char *)(fragname
+1+fragname
[0]-4),
73 if ( strncmp((char *)(fragname
+1+fragname
[0]-6),
77 (or return the connID if it is already loaded */
78 err
= GetDiskFragment(&libspec
, 0, 0, fragname
,
79 kLoadCFrag
, &connID
, &mainAddr
,
81 if ( err
== cfragImportTooOldErr
|| err
== cfragImportTooNewErr
) {
83 ** Special-case code: if PythonCore is too old or too new this means
84 ** the dynamic module was meant for a different Python.
86 if (errMessage
[0] == 10 && strncmp((char *)errMessage
+1, "PythonCore", 10) == 0 ) {
87 PyOS_snprintf(buf
, sizeof(buf
),
88 "Dynamic module was built for %s version of MacPython",
89 (err
== cfragImportTooOldErr
? "a newer" : "an older"));
90 PyErr_SetString(PyExc_ImportError
, buf
);
95 PyOS_snprintf(buf
, sizeof(buf
), "%.*s: %.200s",
96 errMessage
[0], errMessage
+1,
98 PyErr_SetString(PyExc_ImportError
, buf
);
101 /* Locate the address of the correct init function */
102 PyOS_snprintf(funcname
, sizeof(funcname
), "init%.200s", shortname
);
103 err
= FindSymbol(connID
, Pstring(funcname
), &symAddr
, &class);
105 PyOS_snprintf(buf
, sizeof(buf
), "%s: %.200s",
106 funcname
, PyMac_StrError(err
));
107 PyErr_SetString(PyExc_ImportError
, buf
);
110 p
= (dl_funcptr
)symAddr
;