/* * Copyright (C) 2020 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, see . * */ #include "topology.h" #include #define UNUSED __attribute__((unused)) PyObject *Topology_new (PyTypeObject *type, PyObject *args UNUSED, PyObject *kwargs UNUSED) { TopologyObject *self = (TopologyObject*) type->tp_alloc (type, 0); return (PyObject *) self; } int Topology_init (TopologyObject *self UNUSED, PyObject *args UNUSED, PyObject *kwargs UNUSED) { return 0; } void Topology_dealloc (TopologyObject *self) { Py_TYPE (self)->tp_free ((PyObject *) self); } PyObject *_Topology_get_topology_object (blkid_probe probe) { TopologyObject *result = NULL; blkid_topology topology = NULL; if (!probe) { PyErr_SetString(PyExc_RuntimeError, "internal error"); return NULL; } topology = blkid_probe_get_topology (probe); if (!topology) { PyErr_SetString (PyExc_RuntimeError, "Failed to get topology"); return NULL; } result = PyObject_New (TopologyObject, &TopologyType); if (!result) { PyErr_SetString (PyExc_MemoryError, "Failed to create a new Topology object"); return NULL; } Py_INCREF (result); result->topology = topology; return (PyObject *) result; } static PyObject *Topology_get_alignment_offset (TopologyObject *self, PyObject *Py_UNUSED (ignored)) { unsigned long alignment_offset = blkid_topology_get_alignment_offset (self->topology); return PyLong_FromUnsignedLong (alignment_offset); } static PyObject *Topology_get_logical_sector_size (TopologyObject *self, PyObject *Py_UNUSED (ignored)) { unsigned long logical_sector_size = blkid_topology_get_logical_sector_size (self->topology); return PyLong_FromUnsignedLong (logical_sector_size); } static PyObject *Topology_get_minimum_io_size (TopologyObject *self, PyObject *Py_UNUSED (ignored)) { unsigned long minimum_io_size = blkid_topology_get_minimum_io_size (self->topology); return PyLong_FromUnsignedLong (minimum_io_size); } static PyObject *Topology_get_optimal_io_size (TopologyObject *self, PyObject *Py_UNUSED (ignored)) { unsigned long optimal_io_size = blkid_topology_get_optimal_io_size (self->topology); return PyLong_FromUnsignedLong (optimal_io_size); } static PyObject *Topology_get_physical_sector_size (TopologyObject *self, PyObject *Py_UNUSED (ignored)) { unsigned long physical_sector_size = blkid_topology_get_physical_sector_size (self->topology); return PyLong_FromUnsignedLong (physical_sector_size); } #ifdef HAVE_BLKID_2_36 static PyObject *Topology_get_dax (TopologyObject *self, PyObject *Py_UNUSED (ignored)) { int dax = blkid_topology_get_dax (self->topology); if (dax == 1) Py_RETURN_TRUE; else Py_RETURN_FALSE; } #endif #ifdef HAVE_BLKID_2_39 static PyObject *Topology_get_diskseq (TopologyObject *self, PyObject *Py_UNUSED (ignored)) { uint64_t diskseq = blkid_topology_get_diskseq (self->topology); return PyLong_FromUnsignedLongLong (diskseq); } #endif static PyGetSetDef Topology_getseters[] = { {"alignment_offset", (getter) Topology_get_alignment_offset, NULL, "alignment offset in bytes or 0", NULL}, {"logical_sector_size", (getter) Topology_get_logical_sector_size, NULL, "logical sector size (BLKSSZGET ioctl) in bytes or 0", NULL}, {"minimum_io_size", (getter) Topology_get_minimum_io_size, NULL, "minimum io size in bytes or 0", NULL}, {"optimal_io_size", (getter) Topology_get_optimal_io_size, NULL, "optimal io size in bytes or 0", NULL}, {"physical_sector_size", (getter) Topology_get_physical_sector_size, NULL, "logical sector size (BLKSSZGET ioctl) in bytes or 0", NULL}, #ifdef HAVE_BLKID_2_36 {"dax", (getter) Topology_get_dax, NULL, "whether DAX is supported or not", NULL}, #endif #ifdef HAVE_BLKID_2_39 {"diskseq", (getter) Topology_get_diskseq, NULL, "disk sequence number", NULL}, #endif {NULL, NULL, NULL, NULL, NULL} }; PyTypeObject TopologyType = { PyVarObject_HEAD_INIT (NULL, 0) .tp_name = "blkid.Topology", .tp_basicsize = sizeof (TopologyObject), .tp_itemsize = 0, .tp_flags = Py_TPFLAGS_DEFAULT, .tp_new = Topology_new, .tp_dealloc = (destructor) Topology_dealloc, .tp_init = (initproc) Topology_init, .tp_getset = Topology_getseters, };