From ca92f15e2a5836f0734c82d786dcead732ddad22 Mon Sep 17 00:00:00 2001 From: "Jose M. Guisado Gomez" Date: Wed, 6 Apr 2022 11:31:30 +0200 Subject: Initial commit Add sources, setup.py and .gitignore Build/Install: python setup.py build python setup.py install --- partition.c | 150 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 partition.c (limited to 'partition.c') diff --git a/partition.c b/partition.c new file mode 100644 index 0000000..48f410a --- /dev/null +++ b/partition.c @@ -0,0 +1,150 @@ +#include "fdisk.h" + + +static PyMemberDef Partition_members[] = { + { NULL } +}; + + +static void Partition_dealloc(PartitionObject *self) +{ + if (self->pa) + fdisk_unref_partition(self->pa); + Py_TYPE(self)->tp_free((PyObject *) self); +} + +static PyObject *Partition_new(PyTypeObject *type, + PyObject *args __attribute__((unused)), + PyObject *kwds __attribute__((unused))) +{ + PartitionObject *self = (PartitionObject*) type->tp_alloc(type, 0); + + if (self) + self->pa = NULL; + + return (PyObject *)self; +} + +#define Partition_HELP "Partition()" +static int Partition_init(PartitionObject *self, PyObject *args, PyObject *kwds) +{ + /* + char *kwlist[] = { + "context", + NULL + }; + + if (!PyArg_ParseTupleAndKeywords(args, + kwds, "|O!", kwlist, + &ContextType, &cxt)) { + PyErr_SetString(PyExc_TypeError, "Error"); + return -1; + } + */ + + self->pa = fdisk_new_partition(); + + return 0; +} + + +static PyMethodDef Partition_methods[] = { + {NULL} +}; + + +static PyObject *Partition_get_partno(PartitionObject *self) +{ + if (fdisk_partition_has_partno(self->pa)) { + return PyLong_FromSize_t(fdisk_partition_get_partno(self->pa)); + } + // Py_RETURN_NONE; + return Py_BuildValue("%d", -1); +} +static PyObject *Partition_get_size(PartitionObject *self) +{ + if (fdisk_partition_has_size(self->pa)) { + return PyLong_FromUnsignedLongLong(fdisk_partition_get_size(self->pa)); + } + Py_RETURN_NONE; +} +static PyGetSetDef Partition_getseters[] = { + {"partno", (getter)Partition_get_partno, NULL, "partition number", NULL}, + {"size", (getter)Partition_get_size, NULL, "number of sectors", NULL}, + {NULL} +}; + +static PyObject *Partition_repr(PartitionObject *self) +{ + return PyUnicode_FromFormat("", + self); +} + +PyTypeObject PartitionType = { + PyVarObject_HEAD_INIT(NULL, 0) + "libfdisk.Partition", /*tp_name*/ + sizeof(PartitionObject), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + (destructor)Partition_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + NULL, /*tp_getattr*/ + NULL, /*tp_setattr*/ + NULL, /*tp_compare*/ + (reprfunc) Partition_repr, + NULL, /*tp_as_number*/ + NULL, /*tp_as_sequence*/ + NULL, /*tp_as_mapping*/ + NULL, /*tp_hash */ + NULL, /*tp_call*/ + NULL, /*tp_str*/ + NULL, /*tp_getattro*/ + NULL, /*tp_setattro*/ + NULL, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ + Partition_HELP, /* tp_doc */ + NULL, /* tp_traverse */ + NULL, /* tp_clear */ + NULL, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + NULL, /* tp_iter */ + NULL, /* tp_iternext */ + Partition_methods, /* tp_methods */ + Partition_members, /* tp_members */ + Partition_getseters, /* tp_getset */ + NULL, /* tp_base */ + NULL, /* tp_dict */ + NULL, /* tp_descr_get */ + NULL, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)Partition_init, /* tp_init */ + NULL, /* tp_alloc */ + Partition_new, /* tp_new */ +}; + +PyObject *PyObjectResultPartition(struct fdisk_partition *pa) +{ + PartitionObject *result; + + if (!pa) { + PyErr_SetString(PyExc_AssertionError, "pa assert failed"); + return NULL; + } + + result = PyObject_New(PartitionObject, &PartitionType); + if (!result) { + PyErr_SetString(PyExc_MemoryError, "Couldn't allocate Partition object"); + return NULL; + } + + result->pa = pa; + return (PyObject *) result; +} + +void Partition_AddModuleObject(PyObject *mod) +{ + if (PyType_Ready(&PartitionType) < 0) + return; + + Py_INCREF(&PartitionType); + PyModule_AddObject(mod, "Partition", (PyObject *)&PartitionType); +} -- cgit v1.2.3-18-g5258