summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Drahoš <drahosp@gmail.com>2010-12-08 19:15:11 +0100
committerPeter Drahoš <drahosp@gmail.com>2010-12-08 19:15:11 +0100
commit00d544daf5be733cd3fecb9fe65d8723c92d704d (patch)
tree69fb7daea980e3a6ef8d506b0e730d8c9ae4ebaf
parentb6bf4769e3d25313c461804e3c742f313e185a03 (diff)
downloadlua-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.c49
-rw-r--r--src/luaconf.h20
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