Setting tag util-vserver-pl-0.4-29
[util-vserver-pl.git] / python / vserverimpl.c
index 5e28fa2..8c2818c 100644 (file)
@@ -49,7 +49,6 @@ POSSIBILITY OF SUCH DAMAGE.
 
 #include "config.h"
 #include "vserver.h"
-#include "planetlab.h"
 
 static inline PyObject *inc_and_ret_none(void)
 {
@@ -60,61 +59,8 @@ static inline PyObject *inc_and_ret_none(void)
 #define NONE  inc_and_ret_none()
 
 #define PL_INSECURE_BCAPS      (vc_get_insecurebcaps() | (1 << VC_CAP_NET_BIND_SERVICE))
+#define PL_INSECURE_CCAPS      vc_get_insecureccaps()
 
-/*
- * context create
- */
-static PyObject *
-vserver_chcontext(PyObject *self, PyObject *args)
-{
-  int  ctx_is_new;
-  xid_t  ctx;
-  uint_least64_t bcaps = 0;
-
-  if (!PyArg_ParseTuple(args, "I|K", &ctx, &bcaps))
-    return NULL;
-  bcaps |= ~PL_INSECURE_BCAPS;
-
-  if ((ctx_is_new = pl_chcontext(ctx, bcaps, 0)) < 0)
-    return PyErr_SetFromErrno(PyExc_OSError);
-
-  return PyBool_FromLong(ctx_is_new);
-}
-
-static PyObject *
-vserver_setup_done(PyObject *self, PyObject *args)
-{
-  xid_t  ctx;
-
-  if (!PyArg_ParseTuple(args, "I", &ctx))
-    return NULL;
-
-  if (pl_setup_done(ctx) < 0)
-    return PyErr_SetFromErrno(PyExc_OSError);
-
-  return NONE;
-}
-
-static PyObject *
-vserver_isrunning(PyObject *self, PyObject *args)
-{
-  xid_t  ctx;
-  PyObject *ret;
-  struct stat statbuf;
-  char fname[64];
-
-  if (!PyArg_ParseTuple(args, "I", &ctx))
-    return NULL;
-
-  sprintf(fname,"/proc/virtual/%d", ctx);
-
-  if(stat(&fname[0],&statbuf)==0)
-    ret = PyBool_FromLong(1);
-  else
-    ret = PyBool_FromLong(0);
-
-  return ret;
-}
 
 static PyObject *
 __vserver_get_rlimit(xid_t xid, int resource) {
@@ -151,7 +97,7 @@ vserver_set_rlimit(PyObject *self, PyObject *args) {
   uint32_t bitmask;
   xid_t xid;
   int resource;
-  PyObject *ret;
+  PyObject *ret = NULL;
 
   limits.min = VC_LIM_KEEP;
   limits.soft = VC_LIM_KEEP;
@@ -176,26 +122,6 @@ vserver_set_rlimit(PyObject *self, PyObject *args) {
   return ret;
 }
 
-/*
- * setsched
- */
-static PyObject *
-vserver_setsched(PyObject *self, PyObject *args)
-{
-  xid_t  ctx;
-  uint32_t  cpu_min;
-  uint32_t  cpu_share;
-
-  if (!PyArg_ParseTuple(args, "II|I", &ctx, &cpu_min, &cpu_share))
-    return NULL;
-
-  /* ESRCH indicates that there are no processes in the context */
-  if (pl_setsched(ctx, cpu_min, cpu_share) &&
-      errno != ESRCH)
-    return PyErr_SetFromErrno(PyExc_OSError);
-
-  return NONE;
-}
 
 static PyObject *
 vserver_get_dlimit(PyObject *self, PyObject *args)
@@ -265,34 +191,6 @@ vserver_unset_dlimit(PyObject *self, PyObject *args)
   return NONE; 
 }
 
-static PyObject *
-vserver_killall(PyObject *self, PyObject *args)
-{
-  xid_t        ctx;
-  int  sig;
-  struct vc_ctx_flags cflags = {
-    .flagword = 0,
-    .mask = VC_VXF_PERSISTENT
-  };
-  struct vc_net_flags nflags = {
-    .flagword = 0,
-    .mask = VC_NXF_PERSISTENT
-  };
-
-  if (!PyArg_ParseTuple(args, "Ii", &ctx, &sig))
-    return NULL;
-
-  if (vc_ctx_kill(ctx, 0, sig) && errno != ESRCH)
-    return PyErr_SetFromErrno(PyExc_OSError);
-
-  if (vc_set_cflags(ctx, &cflags) && errno != ESRCH)
-    return PyErr_SetFromErrno(PyExc_OSError);
-
-  if (vc_set_nflags(ctx, &nflags) && errno != ESRCH)
-    return PyErr_SetFromErrno(PyExc_OSError);
-
-  return NONE;
-}
 
 static PyObject *
 vserver_set_bcaps(PyObject *self, PyObject *args)
@@ -337,7 +235,7 @@ vserver_get_bcaps(PyObject *self, PyObject *args)
     return NULL;
 
   if (vc_get_ccaps(ctx, &caps) == -1) {
-    if (errno != -ESRCH)
+    if (errno != ESRCH)
       return PyErr_SetFromErrno(PyExc_OSError);
     else
       caps.bcaps = 0;
@@ -369,6 +267,81 @@ vserver_bcaps2text(PyObject *self, PyObject *args)
   return list;
 }
 
+static PyObject *
+vserver_set_ccaps(PyObject *self, PyObject *args)
+{
+  xid_t ctx;
+  struct vc_ctx_caps caps;
+
+  if (!PyArg_ParseTuple(args, "IK", &ctx, &caps.ccaps))
+    return NULL;
+
+  caps.cmask = PL_INSECURE_CCAPS;
+  caps.bmask = caps.bcaps = 0;
+  if (vc_set_ccaps(ctx, &caps) == -1 && errno != ESRCH)
+    return PyErr_SetFromErrno(PyExc_OSError);
+
+  return NONE;
+}
+
+static PyObject *
+vserver_text2ccaps(PyObject *self, PyObject *args)
+{
+  struct vc_ctx_caps caps = { .ccaps = 0 };
+  const char *list;
+  int len;
+  struct vc_err_listparser err;
+
+  if (!PyArg_ParseTuple(args, "s#", &list, &len))
+    return NULL;
+
+  vc_list2ccap(list, len, &err, &caps);
+
+  return Py_BuildValue("K", caps.ccaps);
+}
+
+static PyObject *
+vserver_get_ccaps(PyObject *self, PyObject *args)
+{
+  xid_t ctx;
+  struct vc_ctx_caps caps;
+
+  if (!PyArg_ParseTuple(args, "I", &ctx))
+    return NULL;
+
+  if (vc_get_ccaps(ctx, &caps) == -1) {
+    if (errno != ESRCH)
+      return PyErr_SetFromErrno(PyExc_OSError);
+    else
+      caps.ccaps = 0;
+  }
+
+  return Py_BuildValue("K", caps.ccaps & PL_INSECURE_CCAPS);
+}
+
+static PyObject *
+vserver_ccaps2text(PyObject *self, PyObject *args)
+{
+  struct vc_ctx_caps caps = { .ccaps = 0 };
+  PyObject *list;
+  const char *cap;
+
+  if (!PyArg_ParseTuple(args, "K", &caps.ccaps))
+    return NULL;
+
+  list = PyString_FromString("");
+
+  while ((cap = vc_loccap2text(&caps.ccaps)) != NULL) {
+    if (list == NULL)
+      break;
+    PyString_ConcatAndDel(&list, PyString_FromFormat(
+                         (PyString_Size(list) > 0 ? ",%s" : "%s" ),
+                         cap));
+  }
+
+  return list;
+}
+
 static inline int
 convert_address(const char *str, struct vc_net_addr *addr)
 {
@@ -416,7 +389,7 @@ get_mask(struct vc_net_addr *addr)
     offset = offsetof(struct sockaddr_in6, sin6_addr.s6_addr);
     ip = addr->vna_v6_ip.s6_addr;
     len = 16;
-    addr->vna_v6_mask.s6_addr32[9] = addr->vna_v6_mask.s6_addr32[1] = 0xffffffff;
+    addr->vna_v6_mask.s6_addr32[0] = addr->vna_v6_mask.s6_addr32[1] = 0xffffffff;
     addr->vna_v6_mask.s6_addr32[2] = addr->vna_v6_mask.s6_addr32[3] = 0x00000000;
     addr->vna_prefix = 64;
     break;
@@ -428,7 +401,7 @@ get_mask(struct vc_net_addr *addr)
   if (getifaddrs(&head) == -1)
     return -1;
   for (ifa = head; ifa; ifa = ifa->ifa_next) {
-    if (ifa->ifa_addr->sa_family == family &&
+    if (ifa->ifa_addr && ifa->ifa_addr->sa_family == family &&
         memcmp((char *) ifa->ifa_addr + offset, ip, len) == 0) {
       switch (addr->vna_type) {
       case VC_NXA_TYPE_IPV4:
@@ -612,7 +585,7 @@ vserver_mount(PyObject *self, PyObject *args)
 
   if (secure_chdir(&dirs, guest, target) == -1)
     goto out;
-  if (mount(source, ".", type, flags, data) == -1)
+  if (mount(source, ".", type, flags, data) == -1 && errno != EBUSY)
     goto out;
   restore_dirs(&dirs);
 
@@ -666,13 +639,41 @@ vserver_set_runlevel(PyObject *self, PyObject *args)
   return NONE;
 }
 
+static PyObject *
+vserver_set_name(PyObject *self, PyObject *args)
+{
+  xid_t       ctx, slice_id;
+  PyObject    *ret;
+
+  if (!PyArg_ParseTuple(args, "II", &ctx, &slice_id))
+    return NULL;
+
+  if (vc_set_vhi_name(ctx, vcVHI_CONTEXT, (char *)&slice_id, sizeof(slice_id)) != 0 && errno != ESRCH) {
+    return PyErr_SetFromErrno(PyExc_OSError);
+  } else {
+    return NONE;
+  }
+}
+
+static PyObject *
+vserver_get_name(PyObject *self, PyObject *args)
+{
+  xid_t       ctx, slice_id;
+  PyObject    *ret;
+
+  if (!PyArg_ParseTuple(args, "I", &ctx))
+    return NULL;
+
+  if (vc_get_vhi_name(ctx, vcVHI_CONTEXT, (char *)&slice_id, sizeof(slice_id)) != 0) {
+    ret = PyErr_SetFromErrno(PyExc_OSError);
+  } else {
+    ret = Py_BuildValue("i", slice_id);
+  }
+  return ret;
+}
+
+
 static PyMethodDef  methods[] = {
-  { "chcontext", vserver_chcontext, METH_VARARGS,
-    "chcontext to vserver with provided flags" },
-  { "setup_done", vserver_setup_done, METH_VARARGS,
-    "Release vserver setup lock" },
-  { "setsched", vserver_setsched, METH_VARARGS,
-    "Change vserver scheduling attributes for given vserver context" },
   { "setdlimit", vserver_set_dlimit, METH_VARARGS,
     "Set disk limits for given vserver context" },
   { "unsetdlimit", vserver_unset_dlimit, METH_VARARGS,
@@ -683,10 +684,6 @@ static PyMethodDef  methods[] = {
     "Set resource limits for given resource of a vserver context" },
   { "getrlimit", vserver_get_rlimit, METH_VARARGS,
     "Get resource limits for given resource of a vserver context" },
-  { "killall", vserver_killall, METH_VARARGS,
-    "Send signal to all processes in vserver context" },
-  { "isrunning", vserver_isrunning, METH_VARARGS,
-    "Check if vserver is running"},
   { "setbcaps", vserver_set_bcaps, METH_VARARGS,
     "Set POSIX capabilities of a vserver context" },
   { "getbcaps", vserver_get_bcaps, METH_VARARGS,
@@ -695,6 +692,14 @@ static PyMethodDef  methods[] = {
     "Translate a string of capabilities to a bitmap" },
   { "bcaps2text", vserver_bcaps2text, METH_VARARGS,
     "Translate a capability-bitmap into a string" },
+  { "setccaps", vserver_set_ccaps, METH_VARARGS,
+    "Set context capabilities of a vserver context" },
+  { "getccaps", vserver_get_ccaps, METH_VARARGS,
+    "Get context capabilities of a vserver context" },
+  { "text2ccaps", vserver_text2ccaps, METH_VARARGS,
+    "Translate a string of context capabilities to a bitmap" },
+  { "ccaps2text", vserver_ccaps2text, METH_VARARGS,
+    "Translate a context-capability-bitmap into a string" },
   { "netadd", vserver_net_add, METH_VARARGS,
     "Assign an IP address to a context" },
   { "netremove", vserver_net_remove, METH_VARARGS,
@@ -705,6 +710,10 @@ static PyMethodDef  methods[] = {
     "Perform the umount2() system call" },
   { "setrunlevel", vserver_set_runlevel, METH_VARARGS,
     "Set the runlevel in utmp" },
+  { "setname", vserver_set_name, METH_VARARGS,
+    "Set the vcVHI_CONTEXT for a xid." },
+  { "getname", vserver_get_name, METH_VARARGS,
+    "Get the vcVHI_CONTEXT for a xid." },
   { NULL, NULL, 0, NULL }
 };
 
@@ -724,6 +733,7 @@ initvserverimpl(void)
   /* export limit-related constants */
   PyModule_AddIntConstant(mod, "DLIMIT_KEEP", (int)VC_CDLIM_KEEP);
   PyModule_AddIntConstant(mod, "DLIMIT_INF", (int)VC_CDLIM_INFINITY);
+  PyModule_AddIntConstant(mod, "VC_LIM_INFINITY", (int)VC_LIM_INFINITY);
   PyModule_AddIntConstant(mod, "VC_LIM_KEEP", (int)VC_LIM_KEEP);
 
   PyModule_AddIntConstant(mod, "RLIMIT_CPU", (int)RLIMIT_CPU);