Skip to content

Commit 94c1b3a

Browse files
committed
Handling of LUA_PATH/LUA_CPATH moved back to 'package' library
to avoid incompatibilites with previous releases
1 parent 08199ad commit 94c1b3a

File tree

3 files changed

+101
-94
lines changed

3 files changed

+101
-94
lines changed

loadlib.c

Lines changed: 92 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
** $Id: loadlib.c,v 1.128 2016/07/18 17:55:59 roberto Exp roberto $
2+
** $Id: loadlib.c,v 1.129 2016/12/04 20:17:24 roberto Exp roberto $
33
** Dynamic library loader for Lua
44
** See Copyright Notice in lua.h
55
**
@@ -64,6 +64,9 @@ static const int CLIBS = 0;
6464
#define LIB_FAIL "open"
6565

6666

67+
#define setprogdir(L) ((void)0)
68+
69+
6770
/*
6871
** system-dependent functions
6972
*/
@@ -155,6 +158,30 @@ static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym) {
155158
#endif
156159

157160

161+
#undef setprogdir
162+
163+
164+
/*
165+
** Replace in the path (on the top of the stack) any occurrence
166+
** of LUA_EXEC_DIR with the executable's path.
167+
*/
168+
static void setprogdir (lua_State *L) {
169+
char buff[MAX_PATH + 1];
170+
char *lb;
171+
DWORD nsize = sizeof(buff)/sizeof(char);
172+
DWORD n = GetModuleFileNameA(NULL, buff, nsize); /* get exec. name */
173+
if (n == 0 || n == nsize || (lb = strrchr(buff, '\\')) == NULL)
174+
luaL_error(L, "unable to get ModuleFileName");
175+
else {
176+
*lb = '\0'; /* cut name on the last '\\' to get the path */
177+
luaL_gsub(L, lua_tostring(L, -1), LUA_EXEC_DIR, buff);
178+
lua_remove(L, -2); /* remove original string */
179+
}
180+
}
181+
182+
183+
184+
158185
static void pusherror (lua_State *L) {
159186
int error = GetLastError();
160187
char buffer[128];
@@ -223,6 +250,67 @@ static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym) {
223250
#endif /* } */
224251

225252

253+
/*
254+
** {==================================================================
255+
** Set Paths
256+
** ===================================================================
257+
*/
258+
259+
/*
260+
** LUA_PATH_VAR and LUA_CPATH_VAR are the names of the environment
261+
** variables that Lua check to set its paths.
262+
*/
263+
#if !defined(LUA_PATH_VAR)
264+
#define LUA_PATH_VAR "LUA_PATH"
265+
#endif
266+
267+
#if !defined(LUA_CPATH_VAR)
268+
#define LUA_CPATH_VAR "LUA_CPATH"
269+
#endif
270+
271+
272+
#define AUXMARK "\1" /* auxiliary mark */
273+
274+
275+
/*
276+
** return registry.LUA_NOENV as a boolean
277+
*/
278+
static int noenv (lua_State *L) {
279+
int b;
280+
lua_getfield(L, LUA_REGISTRYINDEX, "LUA_NOENV");
281+
b = lua_toboolean(L, -1);
282+
lua_pop(L, 1); /* remove value */
283+
return b;
284+
}
285+
286+
287+
/*
288+
** Set a path
289+
*/
290+
static void setpath (lua_State *L, const char *fieldname,
291+
const char *envname,
292+
const char *dft) {
293+
const char *nver = lua_pushfstring(L, "%s%s", envname, LUA_VERSUFFIX);
294+
const char *path = getenv(nver); /* use versioned name */
295+
if (path == NULL) /* no environment variable? */
296+
path = getenv(envname); /* try unversioned name */
297+
if (path == NULL || noenv(L)) /* no environment variable? */
298+
lua_pushstring(L, dft); /* use default */
299+
else {
300+
/* replace ";;" by ";AUXMARK;" and then AUXMARK by default path */
301+
path = luaL_gsub(L, path, LUA_PATH_SEP LUA_PATH_SEP,
302+
LUA_PATH_SEP AUXMARK LUA_PATH_SEP);
303+
luaL_gsub(L, path, AUXMARK, dft);
304+
lua_remove(L, -2); /* remove result from 1st 'gsub' */
305+
}
306+
setprogdir(L);
307+
lua_setfield(L, -3, fieldname); /* package[fieldname] = path value */
308+
lua_pop(L, 1); /* pop versioned variable name */
309+
}
310+
311+
/* }================================================================== */
312+
313+
226314
/*
227315
** return registry.CLIBS[path]
228316
*/
@@ -680,10 +768,9 @@ LUAMOD_API int luaopen_package (lua_State *L) {
680768
createclibstable(L);
681769
luaL_newlib(L, pk_funcs); /* create 'package' table */
682770
createsearcherstable(L);
683-
lua_pushstring(L, LUA_PATH_DEFAULT);
684-
lua_setfield(L, -2, "path"); /* package.path = default path */
685-
lua_pushstring(L, LUA_CPATH_DEFAULT);
686-
lua_setfield(L, -2, "cpath"); /* package.cpath = default cpath */
771+
/* set paths */
772+
setpath(L, "path", LUA_PATH_VAR, LUA_PATH_DEFAULT);
773+
setpath(L, "cpath", LUA_CPATH_VAR, LUA_CPATH_DEFAULT);
687774
/* store config information */
688775
lua_pushliteral(L, LUA_DIRSEP "\n" LUA_PATH_SEP "\n" LUA_PATH_MARK "\n"
689776
LUA_EXEC_DIR "\n" LUA_IGMARK "\n");

lua.c

Lines changed: 5 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
** $Id: lua.c,v 1.228 2016/12/13 15:50:58 roberto Exp roberto $
2+
** $Id: lua.c,v 1.229 2016/12/22 13:08:50 roberto Exp roberto $
33
** Lua stand-alone interpreter
44
** See Copyright Notice in lua.h
55
*/
@@ -20,8 +20,6 @@
2020
#include "lualib.h"
2121

2222

23-
#define LUA_VERSUFFIX "_" LUA_VERSION_MAJOR "_" LUA_VERSION_MINOR
24-
2523

2624
#if !defined(LUA_PROMPT)
2725
#define LUA_PROMPT "> "
@@ -534,88 +532,6 @@ static int runargs (lua_State *L, char **argv, int n) {
534532

535533

536534

537-
/*
538-
** {==================================================================
539-
** Set Paths
540-
** ===================================================================
541-
*/
542-
543-
/*
544-
** LUA_PATH_VAR and LUA_CPATH_VAR are the names of the environment
545-
** variables that Lua check to set its paths.
546-
*/
547-
#if !defined(LUA_PATH_VAR)
548-
#define LUA_PATH_VAR "LUA_PATH"
549-
#endif
550-
551-
#if !defined(LUA_CPATH_VAR)
552-
#define LUA_CPATH_VAR "LUA_CPATH"
553-
#endif
554-
555-
#define LUA_PATHVARVERSION LUA_PATH_VAR LUA_VERSUFFIX
556-
#define LUA_CPATHVARVERSION LUA_CPATH_VAR LUA_VERSUFFIX
557-
558-
559-
#define AUXMARK "\1" /* auxiliary mark */
560-
561-
562-
#if defined(LUA_USE_WINDOWS)
563-
564-
565-
/*
566-
** Replace in the path (on the top of the stack) any occurrence
567-
** of LUA_EXEC_DIR with the executable's path.
568-
*/
569-
static void setprogdir (lua_State *L) {
570-
char buff[MAX_PATH + 1];
571-
char *lb;
572-
DWORD nsize = sizeof(buff)/sizeof(char);
573-
DWORD n = GetModuleFileNameA(NULL, buff, nsize); /* get exec. name */
574-
if (n == 0 || n == nsize || (lb = strrchr(buff, '\\')) == NULL)
575-
luaL_error(L, "unable to get ModuleFileName");
576-
else {
577-
*lb = '\0'; /* cut name on the last '\\' to get the path */
578-
luaL_gsub(L, lua_tostring(L, -1), LUA_EXEC_DIR, buff);
579-
lua_remove(L, -2); /* remove original string */
580-
}
581-
}
582-
583-
#else
584-
585-
#define setprogdir(L) ((void)0)
586-
587-
#endif
588-
589-
/*
590-
** Change a path according to corresponding environment variables
591-
*/
592-
static void chgpath (lua_State *L, const char *fieldname,
593-
const char *envname1,
594-
const char *envname2,
595-
int noenv) {
596-
const char *path = getenv(envname1);
597-
lua_getglobal(L, LUA_LOADLIBNAME); /* get 'package' table */
598-
lua_getfield(L, -1, fieldname); /* get original path */
599-
if (path == NULL) /* no environment variable? */
600-
path = getenv(envname2); /* try alternative name */
601-
if (path == NULL || noenv) /* no environment variable? */
602-
lua_pushvalue(L, -1); /* use original value */
603-
else {
604-
const char *def = lua_tostring(L, -1); /* default path */
605-
/* replace ";;" by ";AUXMARK;" and then AUXMARK by default path */
606-
path = luaL_gsub(L, path, LUA_PATH_SEP LUA_PATH_SEP,
607-
LUA_PATH_SEP AUXMARK LUA_PATH_SEP);
608-
luaL_gsub(L, path, AUXMARK, def);
609-
lua_remove(L, -2); /* remove result from 1st 'gsub' */
610-
}
611-
setprogdir(L);
612-
lua_setfield(L, -3, fieldname); /* set path value */
613-
lua_pop(L, 2); /* pop 'package' table and original path */
614-
}
615-
616-
/* }================================================================== */
617-
618-
619535
static int handle_luainit (lua_State *L) {
620536
const char *name = "=" LUA_INITVARVERSION;
621537
const char *init = getenv(name + 1);
@@ -648,10 +564,11 @@ static int pmain (lua_State *L) {
648564
}
649565
if (args & has_v) /* option '-v'? */
650566
print_version();
567+
if (args & has_E) { /* option '-E'? */
568+
lua_pushboolean(L, 1); /* signal for libraries to ignore env. vars. */
569+
lua_setfield(L, LUA_REGISTRYINDEX, "LUA_NOENV");
570+
}
651571
luaL_openlibs(L); /* open standard libraries */
652-
/* change paths according to env variables */
653-
chgpath(L, "path", LUA_PATHVARVERSION, LUA_PATH_VAR, (args & has_E));
654-
chgpath(L, "cpath", LUA_CPATHVARVERSION, LUA_CPATH_VAR, (args & has_E));
655572
createargtable(L, argv, argc, script); /* create table 'arg' */
656573
if (!(args & has_E)) { /* no option '-E'? */
657574
if (handle_luainit(L) != LUA_OK) /* run LUA_INIT */

lualib.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
** $Id: lualib.h,v 1.43 2011/12/08 12:11:37 roberto Exp roberto $
2+
** $Id: lualib.h,v 1.44 2014/02/06 17:32:33 roberto Exp roberto $
33
** Lua standard libraries
44
** See Copyright Notice in lua.h
55
*/
@@ -11,6 +11,9 @@
1111
#include "lua.h"
1212

1313

14+
/* version suffix for environment variable names */
15+
#define LUA_VERSUFFIX "_" LUA_VERSION_MAJOR "_" LUA_VERSION_MINOR
16+
1417

1518
LUAMOD_API int (luaopen_base) (lua_State *L);
1619

0 commit comments

Comments
 (0)