Clean up code for setting rlimits
[util-vserver-pl.git] / python / vserverimpl.c
index eef6f8e..9d4a503 100644 (file)
@@ -145,9 +145,10 @@ vserver_get_rlimit(PyObject *self, PyObject *args) {
 static PyObject *
 vserver_set_rlimit(PyObject *self, PyObject *args) {
   struct vc_rlimit limits;
-  struct rlimit lim;
+  struct vc_rlimit_mask mask;
+  uint32_t bitmask;
   xid_t xid;
-  int resource, lresource;
+  int resource;
   PyObject *ret;
 
   limits.min = VC_LIM_KEEP;
@@ -157,30 +158,18 @@ vserver_set_rlimit(PyObject *self, PyObject *args) {
   if (!PyArg_ParseTuple(args, "IiLLL", &xid, &resource, &limits.hard, &limits.soft, &limits.min))
     return NULL;
 
-  lresource = resource;
-  switch (resource) {
-  case VC_VLIMIT_NSOCK:
-  case VC_VLIMIT_ANON:
-  case VC_VLIMIT_SHMEM:
-    goto do_vc_set_rlimit;
-  case VC_VLIMIT_OPENFD:
-    lresource = RLIMIT_NOFILE;
-    break;
-  default:
-    break;
-  }
-
-  getrlimit(lresource,&lim);
-  if (adjust_lim(&limits,&lim)) {
-    setrlimit(lresource, &lim);
-  }
-
- do_vc_set_rlimit:
   errno = 0;
-  if (vc_set_rlimit(xid, resource, &limits)==-1) 
+
+  if (vc_get_rlimit_mask(xid, &mask)==-1) {
     ret = PyErr_SetFromErrno(PyExc_OSError);
-  else
-    ret = __vserver_get_rlimit(xid, resource);
+  } else {
+    bitmask = (1<<resource);
+    if ((mask.min|mask.soft|mask.hard) & bitmask) 
+      if (vc_set_rlimit(xid, resource, &limits)==-1) 
+       ret = PyErr_SetFromErrno(PyExc_OSError);
+      else
+       ret = __vserver_get_rlimit(xid, resource);
+  }
 
   return ret;
 }