util.pposix: Correctly handle 'unlimited' limits (RLIM_INFINITY), by returning and accepting the string 'unlimited' in get/setrlimit()
authorMatthew Wild <mwild1@gmail.com>
Sat, 29 Jun 2013 14:45:38 +0100
changeset 5719 84025249fc04
parent 5716 8a0465de172e
child 5720 449399a7e136
util.pposix: Correctly handle 'unlimited' limits (RLIM_INFINITY), by returning and accepting the string 'unlimited' in get/setrlimit()
util-src/pposix.c
--- a/util-src/pposix.c	Fri Jun 28 19:34:57 2013 +0200
+++ b/util-src/pposix.c	Sat Jun 29 14:45:38 2013 +0100
@@ -491,48 +491,51 @@
 	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) {
+	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;
+	}
+
+	rid = string2resource(luaL_checkstring(L, 1));
+	if (rid == -1) {
+		lua_pushboolean(L, 0);
+		lua_pushstring(L, "invalid-resource");
+		return 2;
 	}
 
-	resource = luaL_checkstring(L, 1);
-	softlimit = luaL_checkinteger(L, 2);
-	hardlimit = luaL_checkinteger(L, 3);
-
-	rid = string2resource(resource);
-	if (rid != -1) {
-		struct rlimit lim;
-		struct rlimit lim_current;
+	/* 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 || hardlimit < 0) {
-			if (getrlimit(rid, &lim_current)) {
-				lua_pushboolean(L, 0);
-				lua_pushstring(L, "getrlimit-failed");
-				return 2;
-			}
-		}
+	lim.rlim_cur = arg_to_rlimit(L, 2, lim.rlim_cur);
+	lim.rlim_max = arg_to_rlimit(L, 3, lim.rlim_max);
 
-		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");
-			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);
@@ -551,6 +554,8 @@
 		return 2;
 	}
 
+
+
 	resource = luaL_checkstring(L, 1);
 	rid = string2resource(resource);
 	if (rid != -1) {
@@ -566,8 +571,14 @@
 		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;
 }