/*** Set the uid, euid, gid, egid, sid or pid & gid. @function setpid @string what one of 'u', 'U', 'g', 'G', 's', 'p' (upper-case means "effective") @int id (uid, gid or pid for every value of `what` except 's') @int[opt] gid (only for `what` value 'p') @treturn[1] int `0`, if successful @return[2] nil @treturn[2] string error message @treturn[2] int errnum @see setuid(2) @see seteuid(2) @see setgid(2) @see setegid(2) @see setsid(2) @see setpgid(2) */ static int Psetpid(lua_State *L) { const char *what=luaL_checkstring(L, 1); checknargs(L, *what == 'p' ? 3 : 2); switch (*what) { case 'U': return pushresult(L, seteuid(mygetuid(L, 2)), NULL); case 'u': return pushresult(L, setuid(mygetuid(L, 2)), NULL); case 'G': return pushresult(L, setegid(mygetgid(L, 2)), NULL); case 'g': return pushresult(L, setgid(mygetgid(L, 2)), NULL); case 's': return pushresult(L, setsid(), NULL); case 'p': { pid_t pid = checkint(L, 2); pid_t pgid = checkint(L, 3); return pushresult(L, setpgid(pid,pgid), NULL); } default: badoption(L, 1, "id", *what); return 0; } }
static int Pchown(lua_State *L) /** chown(path,uid,gid) */ { const char *path = luaL_checkstring(L, 1); uid_t uid = mygetuid(L, 2); gid_t gid = mygetgid(L, 3); return pushresult(L, chown(path, uid, gid), path); }
static int Psetuid(lua_State *L) /** setuid(name or id) */ { return pushresult(L, setuid(mygetuid(L, 1)), NULL); }