merge with 0.30.213
[util-vserver.git] / python / vserverimpl.c
index 85563cc..d16dfa3 100644 (file)
@@ -47,11 +47,6 @@ POSSIBILITY OF SUCH DAMAGE.
 #include "planetlab.h"
 #include "vserver-internal.h"
 
-/* I don't like needing to define __KERNEL__ -- mef */
-#define __KERNEL__
-#include "kernel/limit.h"
-#undef __KERNEL__
-
 #define NONE  ({ Py_INCREF(Py_None); Py_None; })
 
 /*
@@ -60,18 +55,17 @@ POSSIBILITY OF SUCH DAMAGE.
 static PyObject *
 vserver_chcontext(PyObject *self, PyObject *args)
 {
-  int  result;
+  int  ctx_is_new;
   xid_t  ctx;
-  uint32_t  flags = 0;
-  uint32_t  bcaps = ~vc_get_insecurebcaps();
+  uint_least64_t bcaps = ~vc_get_insecurebcaps();
 
-  if (!PyArg_ParseTuple(args, "I|K", &ctx, &flags))
+  if (!PyArg_ParseTuple(args, "I", &ctx))
     return NULL;
 
-  if ((result = pl_chcontext(ctx, flags, bcaps, 0)) < 0)
+  if ((ctx_is_new = pl_chcontext(ctx, bcaps, 0)) < 0)
     return PyErr_SetFromErrno(PyExc_OSError);
 
-  return PyBool_FromLong(result);
+  return PyBool_FromLong(ctx_is_new);
 }
 
 static PyObject *
@@ -102,9 +96,9 @@ vserver_isrunning(PyObject *self, PyObject *args)
   sprintf(fname,"/proc/virtual/%d", ctx);
 
   if(stat(&fname[0],&statbuf)==0)
-    ret = Py_BuildValue("i",1);
+    ret = PyBool_FromLong(1);
   else
-    ret = Py_BuildValue("i",0);
+    ret = PyBool_FromLong(0);
 
   return ret;
 }
@@ -114,6 +108,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
@@ -139,7 +134,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;
@@ -153,29 +148,25 @@ vserver_set_rlimit(PyObject *self, PyObject *args) {
 
   lresource = resource;
   switch (resource) {
-  case VLIMIT_NSOCK:
-  case VLIMIT_ANON:
-  case VLIMIT_SHMEM:
+  case VC_VLIMIT_NSOCK:
+  case VC_VLIMIT_ANON:
+  case VC_VLIMIT_SHMEM:
     goto do_vc_set_rlimit;
-  case VLIMIT_OPENFD:
+  case VC_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);
@@ -210,16 +201,14 @@ vserver_get_dlimit(PyObject *self, PyObject *args)
   PyObject *res;
   char* path;
   unsigned xid;
-  struct vcmd_ctx_dlimit_v0 data;
+  struct vc_ctx_dlimit data;
   int r;
 
   if (!PyArg_ParseTuple(args, "si", &path,&xid))
     return NULL;
 
   memset(&data, 0, sizeof(data));
-  data.name = path;
-  data.flags = 0;
-  r = vserver(VCMD_get_dlimit, xid, &data);
+  r = vc_get_dlimit(path, xid, 0, &data);
   if (r>=0) {
     res = Py_BuildValue("(i,i,i,i,i)",
                        data.space_used,
@@ -240,8 +229,7 @@ vserver_set_dlimit(PyObject *self, PyObject *args)
 {
   char* path;
   unsigned xid;
-  struct vcmd_ctx_dlimit_base_v0 init;
-  struct vcmd_ctx_dlimit_v0 data;
+  struct vc_ctx_dlimit data;
 
   memset(&data,0,sizeof(data));
   if (!PyArg_ParseTuple(args, "siiiiii", &path,
@@ -253,15 +241,8 @@ vserver_set_dlimit(PyObject *self, PyObject *args)
                        &data.reserved))
     return NULL;
 
-  data.name = path;
-  data.flags = 0;
-
-  memset(&init, 0, sizeof(init));
-  init.name = path;
-  init.flags = 0;
-
-  if ((vserver(VCMD_add_dlimit, xid, &init) && errno != EEXIST) ||
-      vserver(VCMD_set_dlimit, xid, &data))
+  if ((vc_add_dlimit(path, xid, 0) && errno != EEXIST) ||
+      vc_set_dlimit(path, xid, 0, &data))
     return PyErr_SetFromErrno(PyExc_OSError);
 
   return NONE; 
@@ -272,16 +253,11 @@ vserver_unset_dlimit(PyObject *self, PyObject *args)
 {
   char  *path;
   unsigned  xid;
-  struct vcmd_ctx_dlimit_base_v0  init;
 
   if (!PyArg_ParseTuple(args, "si", &path, &xid))
     return NULL;
 
-  memset(&init, 0, sizeof(init));
-  init.name = path;
-  init.flags = 0;
-
-  if (vserver(VCMD_rem_dlimit, xid, &init) && errno != ESRCH)
+  if (vc_rem_dlimit(path, xid, 0) && errno != ESRCH)
     return PyErr_SetFromErrno(PyExc_OSError);
 
   return NONE; 
@@ -340,8 +316,8 @@ initvserverimpl(void)
   PyModule_AddStringConstant(mod, "VSERVER_BASEDIR", DEFAULT_VSERVERDIR);
 
   /* export limit-related constants */
-  PyModule_AddIntConstant(mod, "DLIMIT_KEEP", (int)CDLIM_KEEP);
-  PyModule_AddIntConstant(mod, "DLIMIT_INF", (int)CDLIM_INFINITY);
+  PyModule_AddIntConstant(mod, "DLIMIT_KEEP", (int)VC_CDLIM_KEEP);
+  PyModule_AddIntConstant(mod, "DLIMIT_INF", (int)VC_CDLIM_INFINITY);
   PyModule_AddIntConstant(mod, "VC_LIM_KEEP", (int)VC_LIM_KEEP);
 
   PyModule_AddIntConstant(mod, "RLIMIT_CPU", (int)RLIMIT_CPU);
@@ -355,10 +331,10 @@ initvserverimpl(void)
   PyModule_AddIntConstant(mod, "RLIMIT_SIGPENDING", (int)RLIMIT_SIGPENDING);
   PyModule_AddIntConstant(mod, "RLIMIT_MSGQUEUE", (int)RLIMIT_MSGQUEUE);
 
-  PyModule_AddIntConstant(mod, "VLIMIT_NSOCK", (int)VLIMIT_NSOCK);
-  PyModule_AddIntConstant(mod, "VLIMIT_OPENFD", (int)VLIMIT_OPENFD);
-  PyModule_AddIntConstant(mod, "VLIMIT_ANON", (int)VLIMIT_ANON);
-  PyModule_AddIntConstant(mod, "VLIMIT_SHMEM", (int)VLIMIT_SHMEM);
+  PyModule_AddIntConstant(mod, "VLIMIT_NSOCK", (int)VC_VLIMIT_NSOCK);
+  PyModule_AddIntConstant(mod, "VLIMIT_OPENFD", (int)VC_VLIMIT_OPENFD);
+  PyModule_AddIntConstant(mod, "VLIMIT_ANON", (int)VC_VLIMIT_ANON);
+  PyModule_AddIntConstant(mod, "VLIMIT_SHMEM", (int)VC_VLIMIT_SHMEM);
 
   /* scheduler flags */
   PyModule_AddIntConstant(mod,