]> git.ipfire.org Git - people/ms/libloc.git/blobdiff - src/python/network.c
network: Export family, first_address and last_address in Python
[people/ms/libloc.git] / src / python / network.c
index 9ee50671b98bc674a9255ee81e0c77467910f3df..5496d1ed965e91d8f75d15b43ea56f7300e4a6e2 100644 (file)
@@ -126,6 +126,92 @@ static int Network_set_asn(NetworkObject* self, PyObject* value) {
        return 0;
 }
 
+static PyObject* Network_has_flag(NetworkObject* self, PyObject* args) {
+       enum loc_network_flags flag = 0;
+
+       if (!PyArg_ParseTuple(args, "i", &flag))
+               return NULL;
+
+       if (loc_network_has_flag(self->network, flag))
+               Py_RETURN_TRUE;
+
+       Py_RETURN_FALSE;
+}
+
+static PyObject* Network_set_flag(NetworkObject* self, PyObject* args) {
+       enum loc_network_flags flag = 0;
+
+       if (!PyArg_ParseTuple(args, "i", &flag))
+               return NULL;
+
+       int r = loc_network_set_flag(self->network, flag);
+
+       if (r) {
+               // What exception to throw here?
+               return NULL;
+       }
+
+       Py_RETURN_NONE;
+}
+
+static PyObject* Network_is_subnet_of(NetworkObject* self, PyObject* args) {
+       NetworkObject* other = NULL;
+
+       if (!PyArg_ParseTuple(args, "O!", &NetworkType, &other))
+               return NULL;
+
+       if (loc_network_is_subnet_of(self->network, other->network))
+               Py_RETURN_TRUE;
+
+       Py_RETURN_FALSE;
+}
+
+static PyObject* Network_get_family(NetworkObject* self) {
+       int family = loc_network_address_family(self->network);
+
+       return PyLong_FromLong(family);
+}
+
+static PyObject* Network_get_first_address(NetworkObject* self) {
+       char* address = loc_network_format_first_address(self->network);
+
+       PyObject* obj = PyUnicode_FromString(address);
+       free(address);
+
+       return obj;
+}
+
+static PyObject* Network_get_last_address(NetworkObject* self) {
+       char* address = loc_network_format_last_address(self->network);
+
+       PyObject* obj = PyUnicode_FromString(address);
+       free(address);
+
+       return obj;
+}
+
+static struct PyMethodDef Network_methods[] = {
+       {
+               "has_flag",
+               (PyCFunction)Network_has_flag,
+               METH_VARARGS,
+               NULL,
+       },
+       {
+               "is_subnet_of",
+               (PyCFunction)Network_is_subnet_of,
+               METH_VARARGS,
+               NULL,
+       },
+       {
+               "set_flag",
+               (PyCFunction)Network_set_flag,
+               METH_VARARGS,
+               NULL,
+       },
+       { NULL },
+};
+
 static struct PyGetSetDef Network_getsetters[] = {
        {
                "asn",
@@ -141,19 +227,41 @@ static struct PyGetSetDef Network_getsetters[] = {
                NULL,
                NULL,
        },
+       {
+               "family",
+               (getter)Network_get_family,
+               NULL,
+               NULL,
+               NULL,
+       },
+       {
+               "first_address",
+               (getter)Network_get_first_address,
+               NULL,
+               NULL,
+               NULL,
+       },
+       {
+               "last_address",
+               (getter)Network_get_last_address,
+               NULL,
+               NULL,
+               NULL,
+       },
        { NULL },
 };
 
 PyTypeObject NetworkType = {
        PyVarObject_HEAD_INIT(NULL, 0)
-       tp_name:                "location.Network",
-       tp_basicsize:           sizeof(NetworkObject),
-       tp_flags:               Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE,
-       tp_new:                 Network_new,
-       tp_dealloc:             (destructor)Network_dealloc,
-       tp_init:                (initproc)Network_init,
-       tp_doc:                 "Network object",
-       tp_getset:              Network_getsetters,
-       tp_repr:                (reprfunc)Network_repr,
-       tp_str:                 (reprfunc)Network_str,
+       .tp_name =               "location.Network",
+       .tp_basicsize =          sizeof(NetworkObject),
+       .tp_flags =              Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE,
+       .tp_new =                Network_new,
+       .tp_dealloc =            (destructor)Network_dealloc,
+       .tp_init =               (initproc)Network_init,
+       .tp_doc =                "Network object",
+       .tp_methods =            Network_methods,
+       .tp_getset =             Network_getsetters,
+       .tp_repr =               (reprfunc)Network_repr,
+       .tp_str =                (reprfunc)Network_str,
 };