diff options
author | Peter Drahoš <drahosp@gmail.com> | 2010-12-08 19:15:11 +0100 |
---|---|---|
committer | Peter Drahoš <drahosp@gmail.com> | 2010-12-08 19:15:11 +0100 |
commit | 00d544daf5be733cd3fecb9fe65d8723c92d704d (patch) | |
tree | 69fb7daea980e3a6ef8d506b0e730d8c9ae4ebaf | |
parent | b6bf4769e3d25313c461804e3c742f313e185a03 (diff) | |
download | lua-00d544daf5be733cd3fecb9fe65d8723c92d704d.tar.gz |
LuaDist patch for relative package.[c]path on unix systems. Also provides convinient _PATH global that points to lua.
-rw-r--r-- | src/loadlib.c | 49 | ||||
-rw-r--r-- | src/luaconf.h | 20 |
2 files changed, 65 insertions, 4 deletions
diff --git a/src/loadlib.c b/src/loadlib.c index 0d401eb..5add868 100644 --- a/src/loadlib.c +++ b/src/loadlib.c @@ -59,6 +59,51 @@ static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym); */ #include <dlfcn.h> +#include <sys/stat.h> + +#undef setprogdir + +static void setprogdir (lua_State *L) { + char buff[PATH_MAX + 1]; + char *lb; + int nsize; + +#if defined(__linux__) + nsize = readlink("/proc/self/exe", buff, PATH_MAX - 1); + if (nsize > 0) buff[nsize] = 0; +#elif defined(__FreeBSD__) + int len; + len = readlink("/proc/curproc/file", buff, PATH_MAX - 1); + if (nsize > 0) buff[nsize] = 0; +#else + // Rely on 'lsof' ... sadly this is the best we can do as fallback for most UNIX systems (OSX too) + // lsof will list open files, this includes the executable listed as 1st file + int pid; + FILE* fd; + char cmd[80]; + pid = getpid(); + // Get first open file, lsof marks files as REG + sprintf(cmd, "lsof -p %d | awk '{if ($5==\"REG\") { print $9 ; exit}}'", pid); + + fd = popen(cmd, "r"); + nsize = fread(buff, 1, PATH_MAX - 1, fd); + + // remove newline + if (nsize > 1) buff[nsize - 1] = '\0'; +#endif + + if (nsize == 0 || (lb = strrchr(buff, '/')) == NULL) + luaL_error(L, "unable to get process executable path"); + else { + *lb = '\0'; + // Add _PATH global + lua_pushstring(L, buff); + lua_setglobal(L, "_PATH"); + + luaL_gsub(L, lua_tostring(L, -1), LUA_EXECDIR, buff); + lua_remove(L, -2); /* remove original string */ + } +} static void ll_unloadlib (void *lib) { dlclose(lib); @@ -103,6 +148,10 @@ static void setprogdir (lua_State *L) { luaL_error(L, "unable to get ModuleFileName"); else { *lb = '\0'; + // Add _PATH global + lua_pushstring(L, buff); + lua_setglobal(L, "_PATH"); + luaL_gsub(L, lua_tostring(L, -1), LUA_EXECDIR, buff); lua_remove(L, -2); /* remove original string */ } diff --git a/src/luaconf.h b/src/luaconf.h index e2cb261..cfe746d 100644 --- a/src/luaconf.h +++ b/src/luaconf.h @@ -85,23 +85,35 @@ ** In Windows, any exclamation mark ('!') in the path is replaced by the ** path of the directory of the executable file of the current process. */ + +#define LUADIST_LDIR "!\\..\\share\\lua\\lmod\\" +#define LUADIST_CDIR "!\\..\\share\\lua\\cmod\\" + #define LUA_LDIR "!\\lua\\" #define LUA_CDIR "!\\" #define LUA_PATH_DEFAULT \ - ".\\?.lua;" LUA_LDIR"?.lua;" LUA_LDIR"?\\init.lua;" \ + ".\\?.lua;" LUADIST_LDIR"?.lua;" LUADIST_LDIR"?\\init.lua;" \ + LUA_LDIR"?.lua;" LUA_LDIR"?\\init.lua;" \ LUA_CDIR"?.lua;" LUA_CDIR"?\\init.lua" #define LUA_CPATH_DEFAULT \ - ".\\?.dll;" LUA_CDIR"?.dll;" LUA_CDIR"loadall.dll" + ".\\?.dll;" LUADIST_CDIR"?.dll;" LUADIST_CDIR"loadall.dll;" \ + LUA_CDIR"?.dll;" LUA_CDIR"loadall.dll" #else + +#define LUADIST_LDIR "!/../share/lua/lmod/" +#define LUADIST_CDIR "!/../share/lua/cmod/" + #define LUA_ROOT "/usr/local/" #define LUA_LDIR LUA_ROOT "share/lua/5.1/" #define LUA_CDIR LUA_ROOT "lib/lua/5.1/" #define LUA_PATH_DEFAULT \ - "./?.lua;" LUA_LDIR"?.lua;" LUA_LDIR"?/init.lua;" \ + "./?.lua;" LUADIST_LDIR"?.lua;" LUADIST_LDIR"?/init.lua;" \ + LUA_LDIR"?.lua;" LUA_LDIR"?/init.lua;" \ LUA_CDIR"?.lua;" LUA_CDIR"?/init.lua" #define LUA_CPATH_DEFAULT \ - "./?.so;" LUA_CDIR"?.so;" LUA_CDIR"loadall.so" + "./?.so;" LUADIST_CDIR"?.so;" LUADIST_CDIR"loadall.so;" \ + LUA_CDIR"?.so;" LUA_CDIR"loadall.so" #endif |