]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Added code to import dynamic modules using mac CFM.
authorJack Jansen <jack.jansen@cwi.nl>
Mon, 13 Feb 1995 22:42:34 +0000 (22:42 +0000)
committerJack Jansen <jack.jansen@cwi.nl>
Mon, 13 Feb 1995 22:42:34 +0000 (22:42 +0000)
Python/importdl.c

index 00a033e92c51ee5b3e520f5608f8aa49d56484ee..882402cf89f5896831e991cd338da0a78a34f24e 100644 (file)
@@ -43,6 +43,7 @@ extern int verbose; /* Defined in pythonrun.c */
    NT          -- NT style dynamic linking (using DLLs)
    _DL_FUNCPTR_DEFINED -- if the typedef dl_funcptr has been defined
    WITH_MAC_DL -- Mac dynamic linking (highly experimental)
+   USE_MAC_SHARED_LIBRARY -- Another mac dynamic linking method
    SHORT_EXT   -- short extension for dynamic module, e.g. ".so"
    LONG_EXT    -- long extension, e.g. "module.so"
    hpux                -- HP-UX Dynamic Linking - defined by the compiler
@@ -98,6 +99,15 @@ typedef FARPROC dl_funcptr;
 #define DYNAMIC_LINK
 #endif
 
+#ifdef USE_MAC_SHARED_LIBRARY
+#define DYNAMIC_LINK
+#define SHORT_EXT ".shlb"
+#define LONG_EXT "module.shlb"
+#ifndef _DL_FUNCPTR_DEFINED
+typedef void (*dl_funcptr)();
+#endif
+#endif
+
 #if !defined(DYNAMIC_LINK) && defined(HAVE_DLFCN_H) && defined(HAVE_DLOPEN)
 #define DYNAMIC_LINK
 #define USE_SHLIB
@@ -138,6 +148,13 @@ typedef void (*dl_funcptr)();
 #include "dynamic_load.h"
 #endif
 
+#ifdef USE_MAC_SHARED_LIBRARY
+#include <CodeFragments.h>
+#include <Files.h>
+#include "macdefs.h"
+#include "macglue.h"
+#endif
+
 #ifdef USE_RLD
 #include <mach-o/rld.h>
 #define FUNCNAME_PATTERN "_init%.200s"
@@ -163,9 +180,9 @@ extern char *getprogramname();
 
 #endif /* DYNAMIC_LINK */
 
-/* Max length of module suffix searched for -- accommodates "module.so" */
+/* Max length of module suffix searched for -- accommodates "module.shlb" */
 #ifndef MAXSUFFIXSIZE
-#define MAXSUFFIXSIZE 10
+#define MAXSUFFIXSIZE 12
 #endif
 
 /* Pass it on to import.c */
@@ -203,6 +220,28 @@ load_dynamic_module(name, pathname)
                        return NULL;
        }
 #else /* !WITH_MAC_DL */
+#ifdef USE_MAC_SHARED_LIBRARY
+       /* Another way to do dynloading on the mac, use CFM */
+       {
+               FSSpec libspec;
+               CFragConnectionID connID;
+           Ptr mainAddr;
+           Str255 errMessage;
+           OSErr err;
+               
+               (void)FSMakeFSSpec(0, 0, Pstring(pathname), &libspec);
+               err = GetDiskFragment(&libspec, 0, 0, Pstring(name), kLoadCFrag, &connID, &mainAddr,
+                                               errMessage);
+               if ( err ) {
+                       char buf[512];
+                       
+                       sprintf(buf, "%#s: %s", errMessage, macstrerror(err)); 
+                       err_setstr(ImportError, buf);
+                       return NULL;
+               }
+               p = (dl_funcptr)mainAddr;
+       }
+#endif /* USE_MAC_SHARED_LIBRARY */
 #ifdef USE_SHLIB
        {
 #ifdef RTLD_NOW