From cbf535294c0c170832ba697edee90420a8c8c67b Mon Sep 17 00:00:00 2001 From: Dongsheng Yang Date: Tue, 16 Sep 2014 13:29:11 +0800 Subject: [PATCH] python-lxc: Add [at|de]tach_interface() to python binding. Changelog: 10/15/2014: serge: make ifname mandatory for detach_interface. Signed-off-by: Dongsheng Yang Acked-by: Serge E. Hallyn --- src/python-lxc/lxc.c | 73 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/src/python-lxc/lxc.c b/src/python-lxc/lxc.c index 42b844895..23a8b59dc 100644 --- a/src/python-lxc/lxc.c +++ b/src/python-lxc/lxc.c @@ -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"