- clean up vserver_set_rlimit()
[util-vserver.git] / python / vserverimpl.c
index 1d5a62e..15388ee 100644 (file)
@@ -35,8 +35,10 @@ POSSIBILITY OF SUCH DAMAGE.
 
 #include <errno.h>
 #include <stdint.h>
-#include <unistd.h>
 #include <sys/resource.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
 
 #include "config.h"
 #include "pathconfig.h"
@@ -89,27 +91,21 @@ vserver_setup_done(PyObject *self, PyObject *args)
 static PyObject *
 vserver_isrunning(PyObject *self, PyObject *args)
 {
-  struct vc_vx_info vx_info;
   xid_t  ctx;
   PyObject *ret;
+  struct stat statbuf;
+  char fname[64];
 
   if (!PyArg_ParseTuple(args, "I", &ctx))
     return NULL;
 
-  switch (vc_get_vx_info(ctx, &vx_info)) {
-  case EPERM:
-  case ENOSYS:
-  case EFAULT:
-    return PyErr_SetFromErrno(PyExc_OSError);
-  case ESRCH:
-    /* XXX should be boolean */
-    ret = Py_BuildValue("L",0);
-    break;
-  default:
-    /* XXX should be boolean */
-    ret = Py_BuildValue("L",1);
-    break;
-  }
+  sprintf(fname,"/proc/virtual/%d", ctx);
+
+  if(stat(&fname[0],&statbuf)==0)
+    ret = PyBool_FromLong(1);
+  else
+    ret = PyBool_FromLong(0);
+
   return ret;
 }
 
@@ -118,6 +114,7 @@ __vserver_get_rlimit(xid_t xid, int resource) {
   struct vc_rlimit limits;
   PyObject *ret;
 
+  errno = 0;
   if (vc_get_rlimit(xid, resource, &limits)==-1)
     ret = PyErr_SetFromErrno(PyExc_OSError);
   else
@@ -143,7 +140,7 @@ vserver_get_rlimit(PyObject *self, PyObject *args) {
 static PyObject *
 vserver_set_rlimit(PyObject *self, PyObject *args) {
   struct vc_rlimit limits;
-  struct rlimit olim, nlim;
+  struct rlimit lim;
   xid_t xid;
   int resource, lresource;
   PyObject *ret;
@@ -163,23 +160,19 @@ vserver_set_rlimit(PyObject *self, PyObject *args) {
     goto do_vc_set_rlimit;
   case VLIMIT_OPENFD:
     lresource = RLIMIT_NOFILE;
+    break;
   default:
     break;
   }
 
-  getrlimit(lresource,&olim);
-  if ((limits.min != VC_LIM_KEEP) && (limits.min > olim.rlim_cur)) {
-    nlim.rlim_cur = limits.min;
-    if (limits.min > olim.rlim_max) {
-      nlim.rlim_max = limits.min;
-    } else {
-      nlim.rlim_max = olim.rlim_max;
-    }
-    setrlimit(lresource, &nlim);
+  getrlimit(lresource,&lim);
+  if (adjust_lim(&limits,&lim)) {
+    setrlimit(lresource, &lim);
   }
 
  do_vc_set_rlimit:
-  if (vc_set_rlimit(xid, resource, &limits)) 
+  errno = 0;
+  if (vc_set_rlimit(xid, resource, &limits)==-1) 
     ret = PyErr_SetFromErrno(PyExc_OSError);
   else
     ret = __vserver_get_rlimit(xid, resource);