你如何在Lua中包装IO函数以防止有人离开你的顶级目录.
您将它们放在“MyDoc”中,并且它们可以完全访问MyDoc的所有子内容,但不能将它们放回到C盘或其他任何地方.
最佳答案 打开liolib.c.转到这3个功能
static void opencheck (lua_State *L, const char *fname, const char *mode) {
LStream *p = newfile(L);
p->f = fopen(fname, mode);
if (p->f == NULL)
luaL_error(L, "cannot open file " LUA_QS " (%s)", fname, strerror(errno));
}
static int io_open (lua_State *L) {
const char *filename = luaL_checkstring(L, 1);
const char *mode = luaL_optstring(L, 2, "r");
LStream *p = newfile(L);
const char *md = mode; /* to traverse/check mode */
luaL_argcheck(L, lua_checkmode(md), 2, "invalid mode");
p->f = fopen(filename, mode);
return (p->f == NULL) ? luaL_fileresult(L, 0, filename) : 1;
}
static int io_popen (lua_State *L) {
const char *filename = luaL_checkstring(L, 1);
const char *mode = luaL_optstring(L, 2, "r");
LStream *p = newprefile(L);
p->f = lua_popen(L, filename, mode);
p->closef = &io_pclose;
return (p->f == NULL) ? luaL_fileresult(L, 0, filename) : 1;
}
这些是您要编辑的功能.
第一个接收文件名作为参数fname,第二个和第三个
将其作为本地变量filename从lua堆栈中弹出.
现在你需要做的就是
1)获得自己的流程路径
2)封装给定的文件路径
3)比较它们,使它们在两者上的最后一个斜线上相同
4)如果它们不相同则在opencheck中使用luaL_error(L,“拒绝访问%s”,fname);
在另外两个返回luaL_fileresult(L,0,filename);