improve executable search.

This commit is contained in:
U-vsc-PC\vsc 2014-03-04 12:00:13 +00:00
parent f8f2376394
commit ec8f12d38b
3 changed files with 48 additions and 8 deletions

View File

@ -21,6 +21,10 @@
#if LOAD_DL #if LOAD_DL
// use SWI-Prolog code if all else fails
char *
findExecutable(const char *av0, char *buffer);
#include <stdlib.h> #include <stdlib.h>
#include <dlfcn.h> #include <dlfcn.h>
#include <string.h> #include <string.h>
@ -65,10 +69,9 @@ Yap_CallFunctionByName(const char *thing_string)
char * char *
Yap_FindExecutable(void) Yap_FindExecutable(void)
{ {
if (GLOBAL_argv && GLOBAL_argv[0])
return GLOBAL_argv[0];
#if HAVE_GETEXECNAME #if HAVE_GETEXECNAME
return getxecname(); // Solaris
return getexecname();
#elif __APPLE__ #elif __APPLE__
char path[1024]; char path[1024];
uint32_t size = sizeof(path); uint32_t size = sizeof(path);
@ -83,8 +86,38 @@ Yap_FindExecutable(void)
return "yap"; return "yap";
return rc; return rc;
} }
#elif defined(__linux__)
enum { BUFFERSIZE = 1024 };
char *buf = malloc(BUFFERSIZE);
ssize_t len = readlink("/proc/self/exe", buf, sizeof(buf)-1);
if (len != -1) {
buf[len] = '\0';
return buf;
}
free( buf );
// follow through to standard method
#elif defined(__FreeBSD__) || defined(__DragonFly__)
enum { BUFFERSIZE = 1024 };
char *buf = malloc(BUFFERSIZE);
ssize_t len = readlink("/proc/curproc/file", buf, sizeof(buf)-1);
if (len != -1) {
buf[len] = '\0';
return buf;
}
free( buf );
int mib[4];
mib[0] = CTL_KERN;
mib[1] = KERN_PROC;
mib[2] = KERN_PROC_PATHNAME;
mib[3] = -1; // current process
size_t cb = BUFFERSIZE;
sysctl(mib, 4, buf, &cb, NULL, 0);
// follow through to standard method
#endif #endif
return "yap"; return
findExecutable(GLOBAL_argv[0], buf);
} }
void * void *

View File

@ -30,7 +30,13 @@
char * char *
Yap_FindExecutable(void) Yap_FindExecutable(void)
{ {
return "yap"; enum { BUFFERSIZE = 1024 };
char *buf = malloc(BUFFERSIZE);
if (!GetModuleFileName(NULL, buf, BUFFERSIZE-1))
return NULL;
return buf;
} }
void * void *

7
C/load_dyld.c Normal file → Executable file
View File

@ -62,8 +62,8 @@ mydlerror(void)
* YAP_FindExecutable(argv[0]) should be called on yap initialization to * YAP_FindExecutable(argv[0]) should be called on yap initialization to
* locate the executable of Yap * locate the executable of Yap
*/ */
void char *
Yap_FindExecutable(char *name) Yap_FindExecutable(void)
{ {
char path[1024]; char path[1024];
uint32_t size = sizeof(path); uint32_t size = sizeof(path);
@ -93,7 +93,8 @@ mydlopen(char *path)
/* NSLinkModule will cause the run to abort on any link error's */ /* NSLinkModule will cause the run to abort on any link error's */
/* not very friendly but the error recovery functionality is limited */ /* not very friendly but the error recovery functionality is limited */
handle = NSLinkModule(ofile, path, TRUE); handle = NSLinkModule(ofile, path, TRUE);
} return handle; }
return handle;
} }
static void * static void *