diff options
Diffstat (limited to 'pd/src/s_loader.c')
-rw-r--r-- | pd/src/s_loader.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/pd/src/s_loader.c b/pd/src/s_loader.c index aac50898..bc637dce 100644 --- a/pd/src/s_loader.c +++ b/pd/src/s_loader.c @@ -8,6 +8,8 @@ #ifdef UNISTD #include <stdlib.h> #include <unistd.h> +#include <sys/types.h> +#include <sys/stat.h> #endif #ifdef MSW #include <io.h> @@ -247,7 +249,7 @@ int sys_run_scheduler(const char *externalschedlibname, typedef int (*t_externalschedlibmain)(const char *); t_externalschedlibmain externalmainfunc; char filename[MAXPDSTRING]; - snprintf(filename, sizeof(filename), "%s.%s", externalschedlibname, + snprintf(filename, sizeof(filename), "%s%s", externalschedlibname, sys_dllextent); sys_bashfilename(filename, filename); #ifdef MSW @@ -256,18 +258,28 @@ int sys_run_scheduler(const char *externalschedlibname, if (!ntdll) { post("%s: couldn't load external scheduler lib ", filename); - return (0); + return (1); } externalmainfunc = (t_externalschedlibmain)GetProcAddress(ntdll, "main"); } #else { - void *dlobj = dlopen(filename, RTLD_NOW | RTLD_GLOBAL); + void *dlobj; + struct stat statbuf; + /* if first-choice file extent can't 'stat', go for second */ + if (stat(filename, &statbuf) < 0) + { + snprintf(filename, sizeof(filename), "%s%s", externalschedlibname, + sys_dllextent2); + sys_bashfilename(filename, filename); + } + dlobj = dlopen(filename, RTLD_NOW | RTLD_GLOBAL); if (!dlobj) { post("%s: %s", filename, dlerror()); - return (0); + fprintf(stderr, "dlopen failed for %s: %s\n", filename, dlerror()); + return (1); } externalmainfunc = (t_externalschedlibmain)dlsym(dlobj, "pd_extern_sched"); |