]> git.ipfire.org Git - location/libloc.git/commitdiff
python: Add property to return IP addresses as bytes
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 19 Nov 2020 12:34:11 +0000 (12:34 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 19 Nov 2020 12:34:11 +0000 (12:34 +0000)
This avoids calling inet_pton to parse IP addresses from string

Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libloc.sym
src/loc/network.h
src/network.c
src/python/database.c
src/python/export.py
src/python/network.c

index 53273cdaee6dc6532bfd4be8ee85cca69424192d..406dd15eba036dcb7526a629d8c111ca4872b6ac 100644 (file)
@@ -113,6 +113,8 @@ global:
        loc_network_format_last_address;
        loc_network_get_asn;
        loc_network_get_country_code;
+       loc_network_get_first_address;
+       loc_network_get_last_address;
        loc_network_gt;
        loc_network_has_flag;
        loc_network_is_subnet;
index d86b68534cb91b2cf565067c5c85e5c491bdacc0..4b7410c48bdb9567050f5892a8b8a0ec5473a222 100644 (file)
@@ -39,7 +39,9 @@ struct loc_network* loc_network_unref(struct loc_network* network);
 char* loc_network_str(struct loc_network* network);
 int loc_network_address_family(struct loc_network* network);
 
+const struct in6_addr* loc_network_get_first_address(struct loc_network* network);
 char* loc_network_format_first_address(struct loc_network* network);
+const struct in6_addr* loc_network_get_last_address(struct loc_network* network);
 char* loc_network_format_last_address(struct loc_network* network);
 int loc_network_match_address(struct loc_network* network, const struct in6_addr* address);
 
index 28ca2dfeaee489d95159e08642a865637cd45eda..4c8787acc98cfa6b0e05251dbdff1b5956f1f1eb 100644 (file)
@@ -343,10 +343,18 @@ static char* loc_network_format_address(struct loc_network* network, const struc
        return string;
 }
 
+LOC_EXPORT const struct in6_addr* loc_network_get_first_address(struct loc_network* network) {
+       return &network->first_address;
+}
+
 LOC_EXPORT char* loc_network_format_first_address(struct loc_network* network) {
        return loc_network_format_address(network, &network->first_address);
 }
 
+LOC_EXPORT const struct in6_addr* loc_network_get_last_address(struct loc_network* network) {
+       return &network->last_address;
+}
+
 LOC_EXPORT char* loc_network_format_last_address(struct loc_network* network) {
        return loc_network_format_address(network, &network->last_address);
 }
index ed222759102b5b2ae5bb44c5c5c2447630320b1e..f385c6191c69d372a01ad7a91df2fe84504648b6 100644 (file)
@@ -329,7 +329,7 @@ static PyObject* Database_search_networks(DatabaseObject* self, PyObject* args,
                if (r) {
                        PyErr_SetFromErrno(PyExc_SystemError);
 
-                       loc_as_list_unref(countries);
+                       loc_country_list_unref(countries);
                        return NULL;
                }
 
index 5bc9f30bbef2d91e3755ee59d44865bb733c5e70..6b3987827c195659552ba0b250fb956a76773758 100644 (file)
@@ -142,11 +142,8 @@ class XTGeoIPOutputWriter(OutputWriter):
        mode = "wb"
 
        def _write_network(self, network):
-               for address in (network.first_address, network.last_address):
-                       # Convert this into a string of bits
-                       bytes = socket.inet_pton(network.family, address)
-
-                       self.f.write(bytes)
+               for address in (network._first_address, network._last_address):
+                       self.f.write(address)
 
 
 formats = {
index ed91d6508e468da93d8723051ab306232f930a32..742b472186db90040927c9fe9cc014939b4afa1d 100644 (file)
@@ -215,6 +215,26 @@ static PyObject* Network_get_first_address(NetworkObject* self) {
        return obj;
 }
 
+static PyObject* PyBytes_FromAddress(const struct in6_addr* address6) {
+       struct in_addr address4;
+
+       // Convert IPv4 addresses to struct in_addr
+       if (IN6_IS_ADDR_V4MAPPED(address6)) {
+               address4.s_addr = address6->s6_addr32[3];
+
+               return PyBytes_FromStringAndSize((const char*)&address4, sizeof(address4));
+       }
+
+       // Return IPv6 addresses as they are
+       return PyBytes_FromStringAndSize((const char*)address6, sizeof(*address6));
+}
+
+static PyObject* Network_get__first_address(NetworkObject* self) {
+       const struct in6_addr* address = loc_network_get_first_address(self->network);
+
+       return PyBytes_FromAddress(address);
+}
+
 static PyObject* Network_get_last_address(NetworkObject* self) {
        char* address = loc_network_format_last_address(self->network);
 
@@ -224,6 +244,12 @@ static PyObject* Network_get_last_address(NetworkObject* self) {
        return obj;
 }
 
+static PyObject* Network_get__last_address(NetworkObject* self) {
+       const struct in6_addr* address = loc_network_get_last_address(self->network);
+
+       return PyBytes_FromAddress(address);
+}
+
 static struct PyMethodDef Network_methods[] = {
        {
                "exclude",
@@ -281,6 +307,13 @@ static struct PyGetSetDef Network_getsetters[] = {
                NULL,
                NULL,
        },
+       {
+               "_first_address",
+               (getter)Network_get__first_address,
+               NULL,
+               NULL,
+               NULL,
+       },
        {
                "last_address",
                (getter)Network_get_last_address,
@@ -288,6 +321,13 @@ static struct PyGetSetDef Network_getsetters[] = {
                NULL,
                NULL,
        },
+       {
+               "_last_address",
+               (getter)Network_get__last_address,
+               NULL,
+               NULL,
+               NULL,
+       },
        { NULL },
 };