projects
/
prosody.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (from parent 1:
d096187
)
util.pposix: Correctly handle 'unlimited' limits (RLIM_INFINITY), by returning and...
author
Matthew Wild
<mwild1@gmail.com>
Sat, 29 Jun 2013 13:45:38 +0000
(14:45 +0100)
committer
Matthew Wild
<mwild1@gmail.com>
Sat, 29 Jun 2013 13:45:38 +0000
(14:45 +0100)
util-src/pposix.c
patch
|
blob
|
history
diff --git
a/util-src/pposix.c
b/util-src/pposix.c
index f5cc827032976c74c3ac624620b46aebb85c658a..c0d1f5a29e891484c7fc93139efc0876b9450e88 100644
(file)
--- a/
util-src/pposix.c
+++ b/
util-src/pposix.c
@@
-491,48
+491,51
@@
int string2resource(const char *s) {
return -1;
}
return -1;
}
+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) {
int lc_setrlimit(lua_State *L) {
+ struct rlimit lim;
int arguments = lua_gettop(L);
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");
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_pushboolean(L, 0);
- lua_pushstring(L, "
invalid-resource
");
+ lua_pushstring(L, "
setrlimit-failed
");
return 2;
}
lua_pushboolean(L, 1);
return 2;
}
lua_pushboolean(L, 1);
@@
-551,6
+554,8
@@
int lc_getrlimit(lua_State *L) {
return 2;
}
return 2;
}
+
+
resource = luaL_checkstring(L, 1);
rid = string2resource(resource);
if (rid != -1) {
resource = luaL_checkstring(L, 1);
rid = string2resource(resource);
if (rid != -1) {
@@
-566,8
+571,14
@@
int lc_getrlimit(lua_State *L) {
return 2;
}
lua_pushboolean(L, 1);
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;
}
return 3;
}