X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=util-src%2Fpposix.c;h=d27a84b1726bd3d613df198967e99b58604a4008;hb=dbeef4d3e2933c4441885596f43e5a42683a66cd;hp=fc97b85380182e0e371dede42f838e3497db9d2a;hpb=8f10cdf5a9f901c0ff73cc751322ffbb68ef3bbd;p=prosody.git diff --git a/util-src/pposix.c b/util-src/pposix.c index fc97b853..d27a84b1 100644 --- a/util-src/pposix.c +++ b/util-src/pposix.c @@ -1,7 +1,7 @@ -/* Prosody IM v0.3 +/* Prosody IM v0.4 -- Copyright (C) 2008-2009 Matthew Wild -- Copyright (C) 2008-2009 Waqas Hussain --- Copyright 2009 Tobias Markmann +-- Copyright (C) 2009 Tobias Markmann -- -- This project is MIT/X11 licensed. Please see the -- COPYING file in the source package for more information. @@ -13,7 +13,7 @@ * POSIX support functions for Lua */ -#define MODULE_VERSION "0.3.0" +#define MODULE_VERSION "0.3.1" #include #include @@ -25,6 +25,7 @@ #include #include +#include #include #include @@ -72,10 +73,10 @@ static int lc_daemonize(lua_State *L) } /* Close stdin, stdout, stderr */ -/* close(0); + close(0); close(1); close(2); -*/ + /* Final fork, use it wisely */ if(fork()) exit(0); @@ -173,7 +174,7 @@ int level_constants[] = { LOG_INFO, LOG_NOTICE, LOG_WARNING, - LOG_EMERG, + LOG_CRIT, -1 }; int lc_syslog_log(lua_State* L) @@ -291,6 +292,64 @@ int lc_setuid(lua_State* L) return 2; } +int lc_setgid(lua_State* L) +{ + int gid = -1; + if(lua_gettop(L) < 1) + return 0; + if(!lua_isnumber(L, 1) && lua_tostring(L, 1)) + { + /* Passed GID is actually a string, so look up the GID */ + struct group *g; + g = getgrnam(lua_tostring(L, 1)); + if(!g) + { + lua_pushboolean(L, 0); + lua_pushstring(L, "no-such-group"); + return 2; + } + gid = g->gr_gid; + } + else + { + gid = lua_tonumber(L, 1); + } + + if(gid>-1) + { + /* Ok, attempt setgid */ + errno = 0; + if(setgid(gid)) + { + /* Fail */ + lua_pushboolean(L, 0); + switch(errno) + { + case EINVAL: + lua_pushstring(L, "invalid-gid"); + break; + case EPERM: + lua_pushstring(L, "permission-denied"); + break; + default: + lua_pushstring(L, "unknown-error"); + } + return 2; + } + else + { + /* Success! */ + lua_pushboolean(L, 1); + return 1; + } + } + + /* Seems we couldn't find a valid GID to switch to */ + lua_pushboolean(L, 0); + lua_pushstring(L, "invalid-gid"); + return 2; +} + /* Like POSIX's setrlimit()/getrlimit() API functions. * * Syntax: @@ -302,15 +361,15 @@ int lc_setuid(lua_State* L) * pposix.setrlimit("NOFILE", 1000, 2000) */ int string2resource(const char *s) { - if (!strcmp(resource, "CORE")) return RLIMIT_CORE; - if (!strcmp(resource, "CPU")) return RLIMIT_CPU; - if (!strcmp(resource, "DATA")) return RLIMIT_DATA; - if (!strcmp(resource, "FSIZE")) return RLIMIT_FSIZE; - if (!strcmp(resource, "MEMLOCK")) return RLIMIT_MEMLOCK; - if (!strcmp(resource, "NOFILE")) return RLIMIT_NOFILE; - if (!strcmp(resource, "NPROC")) return RLIMIT_NPROC; - if (!strcmp(resource, "RSS")) return RLIMIT_RSS; - if (!strcmp(resource, "STACK")) return RLIMIT_STACK; + if (!strcmp(s, "CORE")) return RLIMIT_CORE; + if (!strcmp(s, "CPU")) return RLIMIT_CPU; + if (!strcmp(s, "DATA")) return RLIMIT_DATA; + if (!strcmp(s, "FSIZE")) return RLIMIT_FSIZE; + if (!strcmp(s, "MEMLOCK")) return RLIMIT_MEMLOCK; + if (!strcmp(s, "NOFILE")) return RLIMIT_NOFILE; + if (!strcmp(s, "NPROC")) return RLIMIT_NPROC; + if (!strcmp(s, "RSS")) return RLIMIT_RSS; + if (!strcmp(s, "STACK")) return RLIMIT_STACK; return -1; } @@ -322,7 +381,7 @@ int lc_setrlimit(lua_State *L) { int rid = -1; if(arguments < 1 || arguments > 3) { lua_pushboolean(L, 0); - lua_pushstring(L, "Wrong number of arguments"); + lua_pushstring(L, "incorrect-arguments"); } resource = luaL_checkstring(L, 1); @@ -331,30 +390,31 @@ int lc_setrlimit(lua_State *L) { rid = string2resource(resource); if (rid != -1) { - rlimit lim; - rlimit lim_current; + struct rlimit lim; + struct rlimit lim_current; if (softlimit < 0 || hardlimit < 0) { if (getrlimit(rid, &lim_current)) { lua_pushboolean(L, 0); - lua_pushstring(L, "getrlimit() failed."); + lua_pushstring(L, "getrlimit-failed"); return 2; } } - if (softimit < 0) lim.rlim_cur = lim_current.rlim_cur; + if (softlimit < 0) lim.rlim_cur = lim_current.rlim_cur; else lim.rlim_cur = softlimit; if (hardlimit < 0) lim.rlim_max = lim_current.rlim_max; else lim.rlim_max = hardlimit; if (setrlimit(rid, &lim)) { lua_pushboolean(L, 0); - lua_pushstring(L, "setrlimit() failed."); + lua_pushstring(L, "setrlimit-failed"); return 2; } } else { + /* Unsupported resoucrce. Sorry I'm pretty limited by POSIX standard. */ lua_pushboolean(L, 0); - lua_pushstring(L, "Unsupported resoucrce. Sorry I'm pretty limited by POSIX standard."); + lua_pushstring(L, "invalid-resource"); return 2; } lua_pushboolean(L, 1); @@ -365,11 +425,11 @@ int lc_getrlimit(lua_State *L) { int arguments = lua_gettop(L); const char *resource = NULL; int rid = -1; - rlimit lim; + struct rlimit lim; if (arguments != 1) { lua_pushboolean(L, 0); - lua_pushstring(L, "I expect one argument only, the resource string."); + lua_pushstring(L, "invalid-arguments"); return 2; } @@ -378,12 +438,13 @@ int lc_getrlimit(lua_State *L) { if (rid != -1) { if (getrlimit(rid, &lim)) { lua_pushboolean(L, 0); - lua_pushstring(L, "getrlimit() failed."); + lua_pushstring(L, "getrlimit-failed."); return 2; } } else { + /* Unsupported resoucrce. Sorry I'm pretty limited by POSIX standard. */ lua_pushboolean(L, 0); - lua_pushstring(L, "Unsupported resoucrce. Sorry I'm pretty limited by POSIX standard."); + lua_pushstring(L, "invalid-resource"); return 2; } lua_pushboolean(L, 1); @@ -418,9 +479,13 @@ int luaopen_util_pposix(lua_State *L) lua_pushcfunction(L, lc_getuid); lua_setfield(L, -2, "getuid"); + lua_pushcfunction(L, lc_getgid); + lua_setfield(L, -2, "getgid"); lua_pushcfunction(L, lc_setuid); lua_setfield(L, -2, "setuid"); + lua_pushcfunction(L, lc_setgid); + lua_setfield(L, -2, "setgid"); lua_pushcfunction(L, lc_setrlimit); lua_setfield(L, -2, "setrlimit");