Merge 0.9->0.10
[prosody.git] / util-src / pposix.c
index 05303d99ae574a2e1ab990f64d06d206e19fd11a..8ad167b72d25ad5d0e0c3f619207302c09d05c1f 100644 (file)
@@ -13,7 +13,7 @@
 * POSIX support functions for Lua
 */
 
-#define MODULE_VERSION "0.3.5"
+#define MODULE_VERSION "0.3.6"
 
 #include <stdlib.h>
 #include <math.h>
@@ -36,7 +36,7 @@
 #include "lauxlib.h"
 
 #include <fcntl.h>
-#if defined(_GNU_SOURCE)
+#if defined(__linux__) && defined(_GNU_SOURCE)
 #include <linux/falloc.h>
 #endif
 
@@ -204,12 +204,13 @@ int level_constants[] =   {
                        };
 int lc_syslog_log(lua_State* L)
 {
-       int level = luaL_checkoption(L, 1, "notice", level_strings);
-       level = level_constants[level];
+       int level = level_constants[luaL_checkoption(L, 1, "notice", level_strings)];
 
-       luaL_checkstring(L, 2);
+       if(lua_gettop(L) == 3)
+               syslog(level, "%s: %s", luaL_checkstring(L, 2), luaL_checkstring(L, 3));
+       else
+               syslog(level, "%s", lua_tostring(L, 2));
 
-       syslog(level, "%s", lua_tostring(L, 2));
        return 0;
 }
 
@@ -483,52 +484,58 @@ int string2resource(const char *s) {
        if (!strcmp(s, "MEMLOCK")) return RLIMIT_MEMLOCK;
        if (!strcmp(s, "NPROC")) return RLIMIT_NPROC;
        if (!strcmp(s, "RSS")) return RLIMIT_RSS;
+#endif
+#ifdef RLIMIT_NICE
+       if (!strcmp(s, "NICE")) return RLIMIT_NICE;
 #endif
        return -1;
 }
 
+unsigned long int arg_to_rlimit(lua_State* L, int idx, rlim_t current) {
+       switch(lua_type(L, idx)) {
+       case LUA_TSTRING:
+               if(strcmp(lua_tostring(L, idx), "unlimited") == 0)
+                       return RLIM_INFINITY;
+       case LUA_TNUMBER:
+               return lua_tointeger(L, idx);
+       case LUA_TNONE:
+       case LUA_TNIL:
+               return current;
+       default:
+               return luaL_argerror(L, idx, "unexpected type");
+       }
+}
+
 int lc_setrlimit(lua_State *L) {
+       struct rlimit lim;
        int arguments = lua_gettop(L);
-       int softlimit = -1;
-       int hardlimit = -1;
-       const char *resource = NULL;
        int rid = -1;
        if(arguments < 1 || arguments > 3) {
                lua_pushboolean(L, 0);
                lua_pushstring(L, "incorrect-arguments");
+               return 2;
        }
 
-       resource = luaL_checkstring(L, 1);
-       softlimit = luaL_checkinteger(L, 2);
-       hardlimit = luaL_checkinteger(L, 3);
+       rid = string2resource(luaL_checkstring(L, 1));
+       if (rid == -1) {
+               lua_pushboolean(L, 0);
+               lua_pushstring(L, "invalid-resource");
+               return 2;
+       }
 
-       rid = string2resource(resource);
-       if (rid != -1) {
-               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");
-                               return 2;
-                       }
-               }
+       /* Fetch current values to use as defaults */
+       if (getrlimit(rid, &lim)) {
+               lua_pushboolean(L, 0);
+               lua_pushstring(L, "getrlimit-failed");
+               return 2;
+       }
 
-               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;
+       lim.rlim_cur = arg_to_rlimit(L, 2, lim.rlim_cur);
+       lim.rlim_max = arg_to_rlimit(L, 3, lim.rlim_max);
 
-               if (setrlimit(rid, &lim)) {
-                       lua_pushboolean(L, 0);
-                       lua_pushstring(L, "setrlimit-failed");
-                       return 2;
-               }
-       } else {
-               /* Unsupported resoucrce. Sorry I'm pretty limited by POSIX standard. */
+       if (setrlimit(rid, &lim)) {
                lua_pushboolean(L, 0);
-               lua_pushstring(L, "invalid-resource");
+               lua_pushstring(L, "setrlimit-failed");
                return 2;
        }
        lua_pushboolean(L, 1);
@@ -547,6 +554,8 @@ int lc_getrlimit(lua_State *L) {
                return 2;
        }
 
+
+
        resource = luaL_checkstring(L, 1);
        rid = string2resource(resource);
        if (rid != -1) {
@@ -562,8 +571,14 @@ int lc_getrlimit(lua_State *L) {
                return 2;
        }
        lua_pushboolean(L, 1);
-       lua_pushnumber(L, lim.rlim_cur);
-       lua_pushnumber(L, lim.rlim_max);
+       if(lim.rlim_cur == RLIM_INFINITY)
+               lua_pushstring(L, "unlimited");
+       else
+               lua_pushnumber(L, lim.rlim_cur);
+       if(lim.rlim_max == RLIM_INFINITY)
+               lua_pushstring(L, "unlimited");
+       else
+               lua_pushnumber(L, lim.rlim_max);
        return 3;
 }
 
@@ -665,7 +680,7 @@ int lc_fallocate(lua_State* L)
        offset = luaL_checkinteger(L, 2);
        len = luaL_checkinteger(L, 3);
 
-#if defined(_GNU_SOURCE)
+#if defined(__linux__) && defined(_GNU_SOURCE)
        if(fallocate(fileno(f), FALLOC_FL_KEEP_SIZE, offset, len) == 0)
        {
                lua_pushboolean(L, 1);