[lvm-devel] [PATCH 11/12] Add support for lvm_lv_list_lvsegs, lvm_lvseg_get_property
Tony Asleson
tasleson at redhat.com
Mon Sep 24 23:29:22 UTC 2012
Signed-off-by: Tony Asleson <tasleson at redhat.com>
---
liblvm.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 83 insertions(+)
diff --git a/liblvm.c b/liblvm.c
index e44b43d..62521fd 100644
--- a/liblvm.c
+++ b/liblvm.c
@@ -48,9 +48,16 @@ typedef struct {
lvmobject *lvm_obj;
} pvobject;
+typedef struct {
+ PyObject_HEAD
+ lvseg_t lv_seg; /* lv segment handle */
+ lvmobject *lvm_obj;
+} lvsegobject;
+
static PyTypeObject LibLVMvgType;
static PyTypeObject LibLVMlvType;
static PyTypeObject LibLVMpvType;
+static PyTypeObject LibLVMlvsegType;
static PyObject *LibLVMError;
@@ -1295,6 +1302,43 @@ liblvm_lvm_lv_resize(lvobject *self, PyObject *args)
return Py_None;
}
+static PyObject *
+liblvm_lvm_lv_list_lvsegs(lvobject *lv)
+{
+ struct dm_list *lvsegs;
+ lvseg_list_t *lvsegl;
+ PyObject * pytuple;
+ lvsegobject *self;
+ int i = 0;
+
+ LV_VALID(lv);
+
+ lvsegs = lvm_lv_list_lvsegs(lv->lv);
+ if(!lvsegs) {
+ return Py_BuildValue("()");
+ }
+
+ pytuple = PyTuple_New(dm_list_size(lvsegs));
+ if (!pytuple)
+ return NULL;
+
+ dm_list_iterate_items(lvsegl, lvsegs) {
+ /* Create and initialize the object */
+ self = PyObject_New(lvsegobject, &LibLVMlvsegType);
+ if (!self) {
+ Py_DECREF(pytuple);
+ return NULL;
+ }
+
+ self->lv_seg = lvsegl->lvseg;
+ self->lvm_obj = lv->lvm_obj;
+ PyTuple_SET_ITEM(pytuple, i, (PyObject *) self);
+ i++;
+ }
+
+ return pytuple;
+}
+
/* PV Methods */
#define PV_VALID(pvobject) \
@@ -1375,6 +1419,27 @@ liblvm_lvm_pv_resize(pvobject *self, PyObject *args)
return Py_None;
}
+/* LV seg methods */
+
+static void
+liblvm_lvseg_dealloc(lvsegobject *self)
+{
+ PyObject_Del(self);
+}
+
+static PyObject *
+liblvm_lvm_lvseg_get_property(lvsegobject *self, PyObject *args)
+{
+ const char *name;
+ struct lvm_property_value prop_value;
+
+ if (!PyArg_ParseTuple(args, "s", &name))
+ return NULL;
+
+ prop_value = lvm_lvseg_get_property(self->lv_seg, name);
+ return get_property(self->lvm_obj, &prop_value);
+}
+
/* ----------------------------------------------------------------------
* Method tables and other bureaucracy
*/
@@ -1450,6 +1515,7 @@ static PyMethodDef liblvm_lv_methods[] = {
{ "getTags", (PyCFunction)liblvm_lvm_lv_get_tags, METH_NOARGS },
{ "rename", (PyCFunction)liblvm_lvm_lv_rename, METH_VARARGS },
{ "resize", (PyCFunction)liblvm_lvm_lv_resize, METH_VARARGS },
+ { "listLVsegs", (PyCFunction)liblvm_lvm_lv_list_lvsegs, METH_NOARGS },
{ NULL, NULL} /* sentinel */
};
@@ -1466,6 +1532,10 @@ static PyMethodDef liblvm_pv_methods[] = {
{ NULL, NULL} /* sentinel */
};
+static PyMethodDef liblvm_lvseg_methods[] = {
+ { "getProperty", (PyCFunction)liblvm_lvm_lvseg_get_property, METH_VARARGS }
+};
+
static PyTypeObject LiblvmType = {
PyObject_HEAD_INIT(&PyType_Type)
.tp_name = "liblvm.Liblvm",
@@ -1511,6 +1581,17 @@ static PyTypeObject LibLVMpvType = {
.tp_methods = liblvm_pv_methods,
};
+static PyTypeObject LibLVMlvsegType = {
+ PyObject_HEAD_INIT(&PyType_Type)
+ .tp_name = "liblvm.Liblvm_lvseg",
+ .tp_basicsize = sizeof(lvsegobject),
+ .tp_new = PyType_GenericNew,
+ .tp_dealloc = (destructor)liblvm_lvseg_dealloc,
+ .tp_flags = Py_TPFLAGS_DEFAULT,
+ .tp_doc = "LVM Logical Volume Segment object",
+ .tp_methods = liblvm_lvseg_methods,
+};
+
PyMODINIT_FUNC
initlvm(void)
{
@@ -1524,6 +1605,8 @@ initlvm(void)
return;
if (PyType_Ready(&LibLVMpvType) < 0)
return;
+ if (PyType_Ready(&LibLVMlvsegType) < 0)
+ return;
m = Py_InitModule3("lvm", Liblvm_methods, "Liblvm module");
if (m == NULL)
--
1.7.11.4
More information about the lvm-devel
mailing list