diff options
Diffstat (limited to 'core/src/xmake/os/uid.c')
| -rw-r--r-- | core/src/xmake/os/uid.c | 90 |
1 files changed, 87 insertions, 3 deletions
diff --git a/core/src/xmake/os/uid.c b/core/src/xmake/os/uid.c index d19bbd88e..4bcc9d122 100644 --- a/core/src/xmake/os/uid.c +++ b/core/src/xmake/os/uid.c @@ -35,23 +35,107 @@ #include "prefix.h" #ifndef TB_CONFIG_OS_WINDOWS # include <unistd.h> +# include <errno.h> /* ////////////////////////////////////////////////////////////////////////////////////// * implementation */ -// get uid & euid +// get & set uid tb_int_t xm_os_uid(lua_State* lua) { // check tb_assert_and_check_return_val(lua, 0); + tb_int_t ruidset = -1, euidset = -1; + + tb_int_t argc = lua_gettop(lua); + + if (argc == 1) + { + if (lua_istable(lua, 1)) + { + // os.uid({["ruid"] = ruid, ["euid"] = euid}) + lua_getfield(lua, 1, "ruid"); + lua_getfield(lua, 1, "euid"); + if (!lua_isnil(lua, -1)) + { + if (!lua_isnumber(lua, -1)) + { + lua_pushfstring(lua, "invalid field type(%s) in `euid` for os.uid", luaL_typename(lua, -1)); + lua_error(lua); + return 0; + } + euidset = (tb_int_t)lua_tonumber(lua, -1); + } + lua_pop(lua, 1); + if (!lua_isnil(lua, -1)) + { + if (!lua_isnumber(lua, -1)) + { + lua_pushfstring(lua, "invalid field type(%s) in `ruid` for os.uid", luaL_typename(lua, -1)); + lua_error(lua); + return 0; + } + ruidset = (tb_int_t)lua_tonumber(lua, -1); + } + lua_pop(lua, 1); + } else if (lua_isnumber(lua, 1)) + { + // os.uid(uid) + ruidset = euidset = (tb_int_t)lua_tonumber(lua, 1); + } else + { + lua_pushfstring(lua, "invalid argument type(%s) for os.uid", luaL_typename(lua, 1)); + lua_error(lua); + return 0; + } + } else if (argc == 2) + { + // os.uid(ruid, euid) + if (!lua_isnil(lua, 1)) + { + if (!lua_isnumber(lua, 1)) + { + lua_pushfstring(lua, "invalid argument type(%s) for os.uid", luaL_typename(lua, 1)); + lua_error(lua); + return 0; + } + ruidset = (tb_int_t)lua_tonumber(lua, 1); + } + if (!lua_isnil(lua, 2)) + { + if (!lua_isnumber(lua, 2)) + { + lua_pushfstring(lua, "invalid argument type(%s) for os.uid", luaL_typename(lua, 2)); + lua_error(lua); + return 0; + } + euidset = (tb_int_t)lua_tonumber(lua, 2); + } + } else if (argc != 0) + { + lua_pushstring(lua, "invalid argument count for os.uid"); + lua_error(lua); + return 0; + } + + // store return value + lua_newtable(lua); + + if (ruidset != -1 || euidset != -1) + { + // set ruid & euid + lua_pushstring(lua, "errno"); + lua_pushinteger(lua, setreuid(ruidset, euidset) != 0 ? errno : 0); + lua_settable(lua, -3); + } + // get uid & euid uid_t uid = getuid(), euid = geteuid(); // push - lua_newtable(lua); - lua_pushstring(lua, "uid"); + lua_pushstring(lua, "ruid"); lua_pushinteger(lua, uid); lua_settable(lua, -3); lua_pushstring(lua, "euid"); |
