Search code examples
luafilesystemsmount

Lua mount filesystem


I want to mount a filesystem on Linux using Lua, but I haven't found any capability in the lua 5.4 manual or the LuaFileSytem library. Is there some way to mount a filesystem in Lua or with an existing library?


Solution

  • Like most platform-dependent syscall, Lua won't provide such mapping out of the box. So you'll need some C-API module that does the trick. Looks like https://github.com/justincormack/ljsyscall is generic "but" focused on LuaJIT and https://luaposix.github.io/luaposix/ doesn't provide mount.

    I recently had similar needs, and I ended doing the C module:

    static int l_mount(lua_State* L)
    {
        int res = 0;
        // TODO add more checks on args!
        const char *source = luaL_checkstring(L, 1);
        const char *target = luaL_checkstring(L, 2);
        const char *type   = luaL_checkstring(L, 3);
        lua_Integer flags  = luaL_checkinteger(L, 4);
        const char *data   = luaL_checkstring(L, 5);
    
        res = mount(source, target, type, flags, data);
        if ( res != 0)
        {
            int err = errno;
            lua_pushnil(L);
            lua_pushfstring(L, "mount failed: errno[%s]", strerror(err));
            return 2;
        }
        else
        {
            lua_pushfstring(L, "ok");
            return 1;
        }
    }
    
    #define register_constant(s)\
        lua_pushinteger(L, s);\
        lua_setfield(L, -2, #s);
    
    // Module functions
    static const luaL_Reg R[] =
    {
        { "mount", l_mount },
        { NULL, NULL }
    };
    
    int luaopen_sysutils(lua_State* L)
    {
        luaL_newlib(L, R);
    
        // do more mount defines mapping, maybe in some table.
        register_constant(MS_RDONLY);
        //...
        
        return 1;
    }
    
    

    Compile this as a C Lua module, and don't forget that you need CAP_SYS_ADMIN to call mount syscall.