]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
python-lxc: Add [at|de]tach_interface() to python binding.
authorDongsheng Yang <yangds.fnst@cn.fujitsu.com>
Tue, 16 Sep 2014 05:29:11 +0000 (13:29 +0800)
committerSerge Hallyn <serge.hallyn@ubuntu.com>
Wed, 15 Oct 2014 10:20:06 +0000 (12:20 +0200)
Changelog: 10/15/2014: serge: make ifname mandatory for detach_interface.

Signed-off-by: Dongsheng Yang <yangds.fnst@cn.fujitsu.com>
Acked-by: Serge E. Hallyn <serge.hallyn@ubuntu.com>
src/python-lxc/lxc.c

index 42b84489534d7c91c11beca34483adf0b1483fab..23a8b59dc9554ed38b74a47ae230228d069d0930 100644 (file)
@@ -519,6 +519,67 @@ Container_state(Container *self, void *closure)
 }
 
 /* Container Functions */
+static PyObject *
+Container_attach_interface(Container *self, PyObject *args, PyObject *kwds)
+{
+    static char *kwlist[] = {"src_ifname", "dst_ifname", NULL};
+    char *src_name = NULL;
+    char *dst_name = NULL;
+    PyObject *py_src_name = NULL;
+    PyObject *py_dst_name = NULL;
+
+    if (! PyArg_ParseTupleAndKeywords(args, kwds, "O&|O&", kwlist,
+                                      PyUnicode_FSConverter, &py_src_name,
+                                      PyUnicode_FSConverter, &py_dst_name))
+        return NULL;
+
+    if (py_src_name != NULL) {
+        src_name = PyBytes_AS_STRING(py_src_name);
+        assert(src_name != NULL);
+    }
+
+    if (py_dst_name != NULL) {
+        dst_name = PyBytes_AS_STRING(py_dst_name);
+        assert(dst_name != NULL);
+    }
+
+    if (self->container->attach_interface(self->container, src_name,
+                                       dst_name)) {
+        Py_XDECREF(py_src_name);
+        Py_XDECREF(py_dst_name);
+        Py_RETURN_TRUE;
+    }
+
+    Py_XDECREF(py_src_name);
+    Py_XDECREF(py_dst_name);
+    Py_RETURN_FALSE;
+}
+
+static PyObject *
+Container_detach_interface(Container *self, PyObject *args, PyObject *kwds)
+{
+    static char *kwlist[] = {"ifname", NULL};
+    char *ifname = NULL;
+    PyObject *py_ifname = NULL;
+
+    if (! PyArg_ParseTupleAndKeywords(args, kwds, "O&", kwlist,
+                                      PyUnicode_FSConverter, &py_ifname))
+        return NULL;
+
+    if (py_ifname != NULL) {
+        ifname = PyBytes_AS_STRING(py_ifname);
+        assert(ifname != NULL);
+    }
+
+    if (self->container->detach_interface(self->container, ifname, NULL)) {
+        Py_XDECREF(py_ifname);
+        Py_RETURN_TRUE;
+    }
+
+    Py_XDECREF(py_ifname);
+    Py_RETURN_FALSE;
+}
+
 static PyObject *
 Container_add_device_node(Container *self, PyObject *args, PyObject *kwds)
 {
@@ -1470,6 +1531,18 @@ static PyGetSetDef Container_getseters[] = {
 };
 
 static PyMethodDef Container_methods[] = {
+    {"attach_interface", (PyCFunction)Container_attach_interface,
+     METH_VARARGS|METH_KEYWORDS,
+     "attach_interface(src_ifname, dest_ifname) -> boolean\n"
+     "\n"
+     "Pass a new network device to the container."
+    },
+    {"detach_interface", (PyCFunction)Container_detach_interface,
+     METH_VARARGS|METH_KEYWORDS,
+     "detach_interface(ifname) -> boolean\n"
+     "\n"
+     "detach a network device from the container."
+    },
     {"add_device_node", (PyCFunction)Container_add_device_node,
      METH_VARARGS|METH_KEYWORDS,
      "add_device_node(src_path, dest_path) -> boolean\n"