From 9d0e984c3dc4fd280cacb8f45b87c04d9ca62115 Mon Sep 17 00:00:00 2001 From: Alex Szpakowski Date: Sun, 27 Aug 2017 18:14:54 -0300 Subject: [PATCH] Add love.filesystem.getInfo. Deprecate love.filesystem.exists/isDirectory/isFile/isSymlink/getLastModified/getSize. Resolves issue #641. --HG-- branch : minor --- src/modules/filesystem/File.cpp | 14 +- src/modules/filesystem/Filesystem.cpp | 20 ++ src/modules/filesystem/Filesystem.h | 64 +++--- src/modules/filesystem/physfs/Filesystem.cpp | 103 ++++------ src/modules/filesystem/physfs/Filesystem.h | 8 +- src/modules/filesystem/wrap_Filesystem.cpp | 194 ++++++++++++------- src/modules/graphics/wrap_Graphics.cpp | 3 +- src/scripts/boot.lua | 6 +- src/scripts/boot.lua.h | 16 +- 9 files changed, 227 insertions(+), 201 deletions(-) diff --git a/src/modules/filesystem/File.cpp b/src/modules/filesystem/File.cpp index 25adda792..1e17a0ed0 100644 --- a/src/modules/filesystem/File.cpp +++ b/src/modules/filesystem/File.cpp @@ -115,19 +115,19 @@ bool File::getConstant(BufferMode in, const char *&out) StringMap::Entry File::modeEntries[] = { - {"c", File::MODE_CLOSED}, - {"r", File::MODE_READ}, - {"w", File::MODE_WRITE}, - {"a", File::MODE_APPEND}, + { "c", MODE_CLOSED }, + { "r", MODE_READ }, + { "w", MODE_WRITE }, + { "a", MODE_APPEND }, }; StringMap File::modes(File::modeEntries, sizeof(File::modeEntries)); StringMap::Entry File::bufferModeEntries[] = { - {"none", File::BUFFER_NONE}, - {"line", File::BUFFER_LINE}, - {"full", File::BUFFER_FULL}, + { "none", BUFFER_NONE }, + { "line", BUFFER_LINE }, + { "full", BUFFER_FULL }, }; StringMap File::bufferModes(File::bufferModeEntries, sizeof(File::bufferModeEntries)); diff --git a/src/modules/filesystem/Filesystem.cpp b/src/modules/filesystem/Filesystem.cpp index 9830d9b9f..29f6049ab 100644 --- a/src/modules/filesystem/Filesystem.cpp +++ b/src/modules/filesystem/Filesystem.cpp @@ -120,5 +120,25 @@ std::string Filesystem::getExecutablePath() const #endif } +bool Filesystem::getConstant(const char *in, FileType &out) +{ + return fileTypes.find(in, out); +} + +bool Filesystem::getConstant(FileType in, const char *&out) +{ + return fileTypes.find(in, out); +} + +StringMap::Entry Filesystem::fileTypeEntries[] = +{ + { "file", FILETYPE_FILE }, + { "directory", FILETYPE_DIRECTORY }, + { "symlink", FILETYPE_SYMLINK }, + { "other", FILETYPE_OTHER }, +}; + +StringMap Filesystem::fileTypes(Filesystem::fileTypeEntries, sizeof(Filesystem::fileTypeEntries)); + } // filesystem } // love diff --git a/src/modules/filesystem/Filesystem.h b/src/modules/filesystem/Filesystem.h index 85e03a5e6..b465391e8 100644 --- a/src/modules/filesystem/Filesystem.h +++ b/src/modules/filesystem/Filesystem.h @@ -25,6 +25,7 @@ #include "common/config.h" #include "common/Module.h" #include "common/int.h" +#include "common/StringMap.h" #include "FileData.h" #include "File.h" @@ -61,6 +62,23 @@ class Filesystem : public Module { public: + enum FileType + { + FILETYPE_FILE, + FILETYPE_DIRECTORY, + FILETYPE_SYMLINK, + FILETYPE_OTHER, + FILETYPE_MAX_ENUM + }; + + struct Info + { + // Numbers will be -1 if they cannot be determined. + int64 size; + int64 modtime; + FileType type; + }; + static love::Type type; Filesystem(); @@ -167,28 +185,10 @@ public: virtual std::string getRealDirectory(const char *filename) const = 0; /** - * Checks if a path exists. - * @param path The path to check. + * Gets information about the item at the specified filepath. Returns false + * if nothing exists at the path. **/ - virtual bool exists(const char *path) const = 0; - - /** - * Checks if a path is a directory. - * @param dir The directory name to check. - **/ - virtual bool isDirectory(const char *dir) const = 0; - - /** - * Checks if a filename exists. - * @param file The filename to check. - **/ - virtual bool isFile(const char *file) const = 0; - - /** - * Gets whether a filepath is actually a symlink. - * Always returns false if symlinks are not enabled. - **/ - virtual bool isSymlink(const char *filename) const = 0; + virtual bool getInfo(const char *filepath, Info &info) const = 0; /** * Creates a directory. Write dir must be set. @@ -231,19 +231,6 @@ public: **/ virtual void getDirectoryItems(const char *dir, std::vector &items) = 0; - /** - * Gets the last modification time of a file, in seconds - * since the Unix epoch. - * @param filename The name of the file. - **/ - virtual int64 getLastModified(const char *filename) const = 0; - - /** - * Gets the size of a file in bytes. - * @param filename The name of the file. - **/ - virtual int64 getSize(const char *filename) const = 0; - /** * Enable or disable symbolic link support in love.filesystem. **/ @@ -274,10 +261,17 @@ public: **/ virtual std::string getExecutablePath() const; + static bool getConstant(const char *in, FileType &out); + static bool getConstant(FileType in, const char *&out); + private: - //should we save external or internal for Android + // Should we save external or internal for Android bool useExternal; + + static StringMap::Entry fileTypeEntries[]; + static StringMap fileTypes; + }; // Filesystem } // filesystem diff --git a/src/modules/filesystem/physfs/Filesystem.cpp b/src/modules/filesystem/physfs/Filesystem.cpp index 90cbf64ae..15cb7ea29 100644 --- a/src/modules/filesystem/physfs/Filesystem.cpp +++ b/src/modules/filesystem/physfs/Filesystem.cpp @@ -566,60 +566,53 @@ std::string Filesystem::getRealDirectory(const char *filename) const return std::string(dir); } -bool Filesystem::exists(const char *path) const -{ - if (!PHYSFS_isInit()) - return false; - - return PHYSFS_exists(path) != 0; -} - -bool Filesystem::isDirectory(const char *dir) const +bool Filesystem::getInfo(const char *filepath, Info &info) const { if (!PHYSFS_isInit()) return false; #ifdef LOVE_USE_PHYSFS_2_1 PHYSFS_Stat stat = {}; - if (PHYSFS_stat(dir, &stat)) - return stat.filetype == PHYSFS_FILETYPE_DIRECTORY; + if (!PHYSFS_stat(filepath, &stat)) + return false; + + info.size = (int64) stat.filesize; + info.modtime = (int64) stat.modtime; + + if (stat.filetype == PHYSFS_FILETYPE_REGULAR) + info.type = FILETYPE_FILE; + else if (stat.filetype == PHYSFS_FILETYPE_DIRECTORY) + info.type = FILETYPE_DIRECTORY; + else if (stat.filetype == PHYSFS_FILETYPE_SYMLINK) + info.type = FILETYPE_SYMLINK; else - return false; + info.type = FILETYPE_OTHER; #else - return PHYSFS_isDirectory(dir) != 0 && !isSymlink(dir); -#endif -} - -bool Filesystem::isFile(const char *file) const -{ - if (!PHYSFS_isInit()) + if (!PHYSFS_exists(filepath)) return false; -#ifdef LOVE_USE_PHYSFS_2_1 - PHYSFS_Stat stat = {}; - if (PHYSFS_stat(file, &stat)) - return stat.filetype == PHYSFS_FILETYPE_REGULAR; + try + { + File file(filepath); + info.size = file.getSize(); + } + catch (love::Exception &) + { + info.size = -1; + } + + info.modtime = (int64) PHYSFS_getLastModTime(filepath); + + if (PHYSFS_isSymbolicLink(filepath)) + info.type = FILETYPE_SYMLINK; + else if (PHYSFS_isDirectory(filepath)) + info.type = FILETYPE_DIRECTORY; else - return false; -#else - return PHYSFS_exists(file) && !isDirectory(file) && !isSymlink(file); -#endif -} + info.type = FILETYPE_FILE; -bool Filesystem::isSymlink(const char *filename) const -{ - if (!PHYSFS_isInit()) - return false; - -#ifdef LOVE_USE_PHYSFS_2_1 - PHYSFS_Stat stat = {}; - if (PHYSFS_stat(filename, &stat)) - return stat.filetype == PHYSFS_FILETYPE_SYMLINK; - else - return false; -#else - return PHYSFS_isSymbolicLink(filename) != 0; #endif + + return true; } bool Filesystem::createDirectory(const char *dir) @@ -698,34 +691,6 @@ void Filesystem::getDirectoryItems(const char *dir, std::vector &it PHYSFS_freeList(rc); } -int64 Filesystem::getLastModified(const char *filename) const -{ - PHYSFS_sint64 time = -1; - - if (!PHYSFS_isInit()) - return -1; - -#ifdef LOVE_USE_PHYSFS_2_1 - PHYSFS_Stat stat = {}; - if (PHYSFS_stat(filename, &stat)) - time = stat.modtime; -#else - time = PHYSFS_getLastModTime(filename); -#endif - - if (time == -1) - throw love::Exception("Could not determine file modification date."); - - return time; -} - -int64 Filesystem::getSize(const char *filename) const -{ - File file(filename); - int64 size = file.getSize(); - return size; -} - void Filesystem::setSymlinksEnabled(bool enable) { if (!PHYSFS_isInit()) diff --git a/src/modules/filesystem/physfs/Filesystem.h b/src/modules/filesystem/physfs/Filesystem.h index 610a8bc9c..9f2aab236 100644 --- a/src/modules/filesystem/physfs/Filesystem.h +++ b/src/modules/filesystem/physfs/Filesystem.h @@ -72,10 +72,7 @@ public: std::string getRealDirectory(const char *filename) const; - bool exists(const char *path) const; - bool isDirectory(const char *dir) const; - bool isFile(const char *file) const; - bool isSymlink(const char *filename) const; + bool getInfo(const char *filepath, Info &info) const; bool createDirectory(const char *dir); @@ -87,9 +84,6 @@ public: void getDirectoryItems(const char *dir, std::vector &items); - int64 getLastModified(const char *filename) const; - int64 getSize(const char *filename) const; - void setSymlinksEnabled(bool enable); bool areSymlinksEnabled() const; diff --git a/src/modules/filesystem/wrap_Filesystem.cpp b/src/modules/filesystem/wrap_Filesystem.cpp index 42e191bc1..65b3c7185 100644 --- a/src/modules/filesystem/wrap_Filesystem.cpp +++ b/src/modules/filesystem/wrap_Filesystem.cpp @@ -358,31 +358,40 @@ int w_getExecutablePath(lua_State *L) return 1; } -int w_exists(lua_State *L) +int w_getInfo(lua_State *L) { - const char *arg = luaL_checkstring(L, 1); - luax_pushboolean(L, instance()->exists(arg)); - return 1; -} + const char *filepath = luaL_checkstring(L, 1); + Filesystem::Info info = {}; -int w_isDirectory(lua_State *L) -{ - const char *arg = luaL_checkstring(L, 1); - luax_pushboolean(L, instance()->isDirectory(arg)); - return 1; -} + if (instance()->getInfo(filepath, info)) + { + const char *typestr = nullptr; + if (!Filesystem::getConstant(info.type, typestr)) + return luaL_error(L, "Unknown file type."); -int w_isFile(lua_State *L) -{ - const char *arg = luaL_checkstring(L, 1); - luax_pushboolean(L, instance()->isFile(arg)); - return 1; -} + lua_createtable(L, 0, 3); + + lua_pushstring(L, typestr); + lua_setfield(L, -2, "type"); + + // Lua numbers (doubles) can't fit the full range of 64 bit ints. + info.size = std::min(info.size, 0x20000000000000LL); + if (info.size >= 0) + { + lua_pushnumber(L, (lua_Number) info.size); + lua_setfield(L, -2, "size"); + } + + info.modtime = std::min(info.modtime, 0x20000000000000LL); + if (info.modtime >= 0) + { + lua_pushnumber(L, (lua_Number) info.modtime); + lua_setfield(L, -2, "modtime"); + } + } + else + lua_pushnil(L); -int w_isSymlink(lua_State *L) -{ - const char *filename = luaL_checkstring(L, 1); - luax_pushboolean(L, instance()->isSymlink(filename)); return 1; } @@ -551,48 +560,6 @@ int w_load(lua_State *L) } } -int w_getLastModified(lua_State *L) -{ - const char *filename = luaL_checkstring(L, 1); - - int64 time = 0; - try - { - time = instance()->getLastModified(filename); - } - catch (love::Exception &e) - { - return luax_ioError(L, "%s", e.what()); - } - - lua_pushnumber(L, static_cast(time)); - return 1; -} - -int w_getSize(lua_State *L) -{ - const char *filename = luaL_checkstring(L, 1); - - int64 size = -1; - try - { - size = instance()->getSize(filename); - } - catch (love::Exception &e) - { - return luax_ioError(L, "%s", e.what()); - } - - // Error on failure or if size does not fit into a double precision floating-point number. - if (size == -1) - return luax_ioError(L, "Could not determine file size."); - else if (size >= 0x20000000000000LL) - return luax_ioError(L, "Size too large to fit into a Lua number!"); - - lua_pushnumber(L, (lua_Number) size); - return 1; -} - int w_setSymlinksEnabled(lua_State *L) { instance()->setSymlinksEnabled(luax_checkboolean(L, 1)); @@ -702,7 +669,8 @@ int loader(lua_State *L) { replaceAll(element, "?", modulename); - if (inst->isFile(element.c_str())) + Filesystem::Info info = {}; + if (inst->getInfo(element.c_str(), info) && info.type != Filesystem::FILETYPE_DIRECTORY) { lua_pop(L, 1); lua_pushstring(L, element.c_str()); @@ -760,7 +728,8 @@ int extloader(lua_State *L) // And ? with just the filename replaceAll(element, "?", tokenized_name); - if (!inst->isFile(element.c_str())) + Filesystem::Info info = {}; + if (!inst->getInfo(element.c_str(), info) || info.type == Filesystem::FILETYPE_DIRECTORY) continue; // Now resolve the full path, as we're bypassing physfs for the next part. @@ -799,6 +768,85 @@ int extloader(lua_State *L) return 1; } +// Deprecated functions. + +int w_exists(lua_State *L) +{ + luax_markdeprecated(L, "love.filesystem.exists", API_FUNCTION, DEPRECATED_REPLACED, "love.filesystem.getInfo"); + const char *arg = luaL_checkstring(L, 1); + Filesystem::Info info = {}; + luax_pushboolean(L, instance()->getInfo(arg, info)); + return 1; +} + +int w_isDirectory(lua_State *L) +{ + luax_markdeprecated(L, "love.filesystem.exists", API_FUNCTION, DEPRECATED_REPLACED, "love.filesystem.getInfo"); + const char *arg = luaL_checkstring(L, 1); + Filesystem::Info info = {}; + bool exists = instance()->getInfo(arg, info); + luax_pushboolean(L, exists && info.type == Filesystem::FILETYPE_DIRECTORY); + return 1; +} + +int w_isFile(lua_State *L) +{ + luax_markdeprecated(L, "love.filesystem.isFile", API_FUNCTION, DEPRECATED_REPLACED, "love.filesystem.getInfo"); + const char *arg = luaL_checkstring(L, 1); + Filesystem::Info info = {}; + bool exists = instance()->getInfo(arg, info); + luax_pushboolean(L, exists && info.type == Filesystem::FILETYPE_FILE); + return 1; +} + +int w_isSymlink(lua_State *L) +{ + luax_markdeprecated(L, "love.filesystem.isSymlink", API_FUNCTION, DEPRECATED_REPLACED, "love.filesystem.getInfo"); + const char *filename = luaL_checkstring(L, 1); + Filesystem::Info info = {}; + bool exists = instance()->getInfo(filename, info); + luax_pushboolean(L, exists && info.type == Filesystem::FILETYPE_SYMLINK); + return 1; +} + +int w_getLastModified(lua_State *L) +{ + luax_markdeprecated(L, "love.filesystem.getLastModified", API_FUNCTION, DEPRECATED_REPLACED, "love.filesystem.getInfo"); + + const char *filename = luaL_checkstring(L, 1); + + Filesystem::Info info = {}; + bool exists = instance()->getInfo(filename, info); + + if (!exists) + return luax_ioError(L, "File does not exist"); + else if (info.modtime == -1) + return luax_ioError(L, "Could not determine file modification date."); + + lua_pushnumber(L, (lua_Number) info.modtime); + return 1; +} + +int w_getSize(lua_State *L) +{ + luax_markdeprecated(L, "love.filesystem.getSize", API_FUNCTION, DEPRECATED_REPLACED, "love.filesystem.getInfo"); + + const char *filename = luaL_checkstring(L, 1); + + Filesystem::Info info = {}; + bool exists = instance()->getInfo(filename, info); + + if (!exists) + luax_ioError(L, "File does not exist"); + else if (info.size == -1) + return luax_ioError(L, "Could not determine file size."); + else if (info.size >= 0x20000000000000LL) + return luax_ioError(L, "Size too large to fit into a Lua number!"); + + lua_pushnumber(L, (lua_Number) info.size); + return 1; +} + // List of functions to wrap. static const luaL_Reg functions[] = { @@ -820,10 +868,6 @@ static const luaL_Reg functions[] = { "getSourceBaseDirectory", w_getSourceBaseDirectory }, { "getRealDirectory", w_getRealDirectory }, { "getExecutablePath", w_getExecutablePath }, - { "exists", w_exists }, - { "isDirectory", w_isDirectory }, - { "isFile", w_isFile }, - { "isSymlink", w_isSymlink }, { "createDirectory", w_createDirectory }, { "remove", w_remove }, { "read", w_read }, @@ -832,8 +876,7 @@ static const luaL_Reg functions[] = { "getDirectoryItems", w_getDirectoryItems }, { "lines", w_lines }, { "load", w_load }, - { "getLastModified", w_getLastModified }, - { "getSize", w_getSize }, + { "getInfo", w_getInfo }, { "setSymlinksEnabled", w_setSymlinksEnabled }, { "areSymlinksEnabled", w_areSymlinksEnabled }, { "newFileData", w_newFileData }, @@ -841,6 +884,15 @@ static const luaL_Reg functions[] = { "setRequirePath", w_setRequirePath }, { "getCRequirePath", w_getCRequirePath }, { "setCRequirePath", w_setCRequirePath }, + + // Deprecated. + { "exists", w_exists }, + { "isDirectory", w_isDirectory }, + { "isFile", w_isFile }, + { "isSymlink", w_isSymlink }, + { "getLastModified", w_getLastModified }, + { "getSize", w_getSize }, + { 0, 0 } }; diff --git a/src/modules/graphics/wrap_Graphics.cpp b/src/modules/graphics/wrap_Graphics.cpp index 8d27574c9..23547befb 100644 --- a/src/modules/graphics/wrap_Graphics.cpp +++ b/src/modules/graphics/wrap_Graphics.cpp @@ -1220,7 +1220,8 @@ static int w_getShaderSource(lua_State *L, int startidx, bool gles, Shader::Shad size_t slen = 0; const char *str = lua_tolstring(L, i, &slen); - if (fs != nullptr && fs->isFile(str)) + Filesystem::Info info = {}; + if (fs != nullptr && fs->getInfo(str, info)) { FileData *fd = nullptr; luax_catchexcept(L, [&](){ fd = fs->read(str); }); diff --git a/src/scripts/boot.lua b/src/scripts/boot.lua index 70f73094e..fc4438329 100644 --- a/src/scripts/boot.lua +++ b/src/scripts/boot.lua @@ -351,7 +351,7 @@ function love.boot() -- before the save directory (the identity should be appended.) pcall(love.filesystem.setIdentity, identity, true) - if can_has_game and not (love.filesystem.isFile("main.lua") or love.filesystem.isFile("conf.lua")) then + if can_has_game and not (love.filesystem.getInfo("main.lua") or love.filesystem.getInfo("conf.lua")) then no_game_code = true end @@ -425,7 +425,7 @@ function love.init() -- If config file exists, load it and allow it to update config table. local confok, conferr - if (not love.conf) and love.filesystem and love.filesystem.isFile("conf.lua") then + if (not love.conf) and love.filesystem and love.filesystem.getInfo("conf.lua") then confok, conferr = pcall(require, "conf") end @@ -539,7 +539,7 @@ function love.init() if love.filesystem then love.filesystem._setAndroidSaveExternal(c.externalstorage) love.filesystem.setIdentity(c.identity or love.filesystem.getIdentity(), c.appendidentity) - if love.filesystem.isFile("main.lua") then + if love.filesystem.getInfo("main.lua") then require("main") end end diff --git a/src/scripts/boot.lua.h b/src/scripts/boot.lua.h index 1991564b8..eb02dcce5 100644 --- a/src/scripts/boot.lua.h +++ b/src/scripts/boot.lua.h @@ -661,10 +661,10 @@ const unsigned char boot_lua[] = 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, 0x09, 0x69, 0x66, 0x20, 0x63, 0x61, 0x6e, 0x5f, 0x68, 0x61, 0x73, 0x5f, 0x67, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, - 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x69, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x28, 0x22, 0x6d, 0x61, 0x69, 0x6e, - 0x2e, 0x6c, 0x75, 0x61, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x66, 0x69, 0x6c, - 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x69, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x28, 0x22, 0x63, 0x6f, - 0x6e, 0x66, 0x2e, 0x6c, 0x75, 0x61, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x67, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x28, 0x22, 0x6d, 0x61, 0x69, + 0x6e, 0x2e, 0x6c, 0x75, 0x61, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x66, 0x69, + 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x67, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x28, 0x22, + 0x63, 0x6f, 0x6e, 0x66, 0x2e, 0x6c, 0x75, 0x61, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x6e, 0x6f, 0x5f, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a, @@ -783,8 +783,8 @@ const unsigned char boot_lua[] = 0x09, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, - 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x69, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x28, 0x22, 0x63, 0x6f, 0x6e, 0x66, - 0x2e, 0x6c, 0x75, 0x61, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x67, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x28, 0x22, 0x63, 0x6f, 0x6e, + 0x66, 0x2e, 0x6c, 0x75, 0x61, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x63, 0x6f, 0x6e, 0x66, 0x6f, 0x6b, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x2c, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x66, 0x22, 0x29, 0x0a, @@ -999,8 +999,8 @@ const unsigned char boot_lua[] = 0x29, 0x2c, 0x20, 0x63, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x29, 0x0a, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, - 0x65, 0x6d, 0x2e, 0x69, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x28, 0x22, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x6c, 0x75, - 0x61, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x65, 0x6d, 0x2e, 0x67, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x28, 0x22, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x6c, + 0x75, 0x61, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x09, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x29, 0x0a, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a,