From 9e72b8a0c56403ca7d23c6a767d66038e0d63c14 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Wed, 22 May 2024 16:39:57 +0000 Subject: [PATCH] database: Have the lookup function return 0 even if nothing was found This is a potentially breaking change, but I think we need to do this as the previous return code was not very descriptive. Signed-off-by: Michael Tremer --- src/database.c | 5 +++-- src/lua/database.c | 6 ++++-- src/python/database.c | 32 ++++++++++++++++---------------- src/test-network.c | 2 +- 4 files changed, 24 insertions(+), 21 deletions(-) diff --git a/src/database.c b/src/database.c index 617b61e..f6a7c8a 100644 --- a/src/database.c +++ b/src/database.c @@ -924,11 +924,12 @@ static int __loc_database_lookup(struct loc_database* db, const struct in6_addr* // If this node has a leaf, we will check if it matches if (__loc_database_node_is_leaf(node_v1)) { r = __loc_database_lookup_handle_leaf(db, address, network, network_address, level, node_v1); - if (r <= 0) + if (r < 0) return r; } - return 1; + // Return no error - even if nothing was found + return 0; } LOC_EXPORT int loc_database_lookup(struct loc_database* db, diff --git a/src/lua/database.c b/src/lua/database.c index 8d10c43..8328196 100644 --- a/src/lua/database.c +++ b/src/lua/database.c @@ -202,8 +202,10 @@ static int Database_lookup(lua_State* L) { } // Create a network object - r = create_network(L, network); - loc_network_unref(network); + if (network) { + r = create_network(L, network); + loc_network_unref(network); + } return r; } diff --git a/src/python/database.c b/src/python/database.c index d6ee4d0..f84b003 100644 --- a/src/python/database.c +++ b/src/python/database.c @@ -201,35 +201,35 @@ static PyObject* Database_get_country(DatabaseObject* self, PyObject* args) { static PyObject* Database_lookup(DatabaseObject* self, PyObject* args) { struct loc_network* network = NULL; const char* address = NULL; + int r; if (!PyArg_ParseTuple(args, "s", &address)) return NULL; // Try to retrieve a matching network - int r = loc_database_lookup_from_string(self->db, address, &network); + r = loc_database_lookup_from_string(self->db, address, &network); + if (r) { + // Handle any errors + switch (errno) { + case EINVAL: + PyErr_Format(PyExc_ValueError, "Invalid IP address: %s", address); - // We got a network - if (r == 0) { - PyObject* obj = new_network(&NetworkType, network); - loc_network_unref(network); + default: + PyErr_SetFromErrno(PyExc_OSError); + } - return obj; + return NULL; } // Nothing found - if (!errno) + if (!network) Py_RETURN_NONE; - // Handle any errors - switch (errno) { - case EINVAL: - PyErr_Format(PyExc_ValueError, "Invalid IP address: %s", address); - - default: - PyErr_SetFromErrno(PyExc_OSError); - } + // We got a network + PyObject* obj = new_network(&NetworkType, network); + loc_network_unref(network); - return NULL; + return obj; } static PyObject* new_database_enumerator(PyTypeObject* type, struct loc_database_enumerator* enumerator) { diff --git a/src/test-network.c b/src/test-network.c index 69544e2..9eda47f 100644 --- a/src/test-network.c +++ b/src/test-network.c @@ -359,7 +359,7 @@ int main(int argc, char** argv) { // Lookup an address outside the subnet err = loc_database_lookup_from_string(db, "2001:db8:fffe:1::", &network1); - if (err == 0) { + if (err || network1) { fprintf(stderr, "Could look up 2001:db8:fffe:1::, but I shouldn't\n"); exit(EXIT_FAILURE); } -- 2.39.5