From d3d8ede6bf2cdd7dde559ad5be2259553c5704a6 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Thu, 25 Jan 2018 21:26:48 +0000 Subject: [PATCH] database: Implement searching for ASes that match a string Signed-off-by: Michael Tremer --- src/as.c | 18 +++++++++++++++++ src/database.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++ src/libloc.sym | 7 +++++++ src/loc/as.h | 2 ++ src/loc/database.h | 3 +++ src/test-as.c | 19 ++++++++++++++++++ 6 files changed, 98 insertions(+) diff --git a/src/as.c b/src/as.c index f1f01ac..8721eff 100644 --- a/src/as.c +++ b/src/as.c @@ -14,6 +14,7 @@ Lesser General Public License for more details. */ +#include #include #include #include @@ -128,3 +129,20 @@ int loc_as_to_database_v0(struct loc_as* as, struct loc_stringpool* pool, return 0; } + +int loc_as_match_string(struct loc_as* as, const char* string) { + int r = 1; + + char* name = strdup(as->name); + + // Convert string to lowercase + for (char* p = name; *p; p++) + *p = tolower(*p); + + // Search if string is in name + if (strstr(as->name, string) != NULL) + r = 0; + + free(name); + return r; +} diff --git a/src/database.c b/src/database.c index e37baa4..a74888c 100644 --- a/src/database.c +++ b/src/database.c @@ -15,6 +15,7 @@ */ #include +#include #include #include #include @@ -65,6 +66,12 @@ struct loc_database_enumerator { struct loc_ctx* ctx; struct loc_database* db; int refcount; + + // Search string + char* string; + + // Index of the AS we are looking at + unsigned int as_index; }; static int loc_database_read_magic(struct loc_database* db, FILE* f) { @@ -616,6 +623,9 @@ static void loc_database_enumerator_free(struct loc_database_enumerator* enumera loc_database_unref(enumerator->db); loc_unref(enumerator->ctx); + if (enumerator->string) + free(enumerator->string); + free(enumerator); } @@ -629,3 +639,42 @@ LOC_EXPORT struct loc_database_enumerator* loc_database_enumerator_unref(struct loc_database_enumerator_free(enumerator); return NULL; } + +LOC_EXPORT int loc_database_enumerator_set_string(struct loc_database_enumerator* enumerator, const char* string) { + enumerator->string = strdup(string); + + // Make the string lowercase + for (char *p = enumerator->string; *p; p++) + *p = tolower(*p); + + return 0; +} + +LOC_EXPORT struct loc_as* loc_database_enumerator_next_as(struct loc_database_enumerator* enumerator) { + struct loc_database* db = enumerator->db; + struct loc_as* as; + + while (enumerator->as_index < db->as_count) { + // Fetch the next AS + int r = loc_database_fetch_as(db, &as, enumerator->as_index++); + if (r) + return NULL; + + r = loc_as_match_string(as, enumerator->string); + if (r == 0) { + DEBUG(enumerator->ctx, "AS%d (%s) matches %s\n", + loc_as_get_number(as), loc_as_get_name(as), enumerator->string); + + return as; + } + + // No match + loc_as_unref(as); + } + + // Reset the index + enumerator->as_index = 0; + + // We have searched through all of them + return NULL; +} diff --git a/src/libloc.sym b/src/libloc.sym index d6028dc..42e89e5 100644 --- a/src/libloc.sym +++ b/src/libloc.sym @@ -50,6 +50,13 @@ global: loc_database_ref; loc_database_unref; + # Database Enumerator + loc_database_enumerator_new; + loc_database_enumerator_next_as; + loc_database_enumerator_ref; + loc_database_enumerator_set_string; + loc_database_enumerator_unref; + # Network loc_network_get_asn; loc_network_get_country_code; diff --git a/src/loc/as.h b/src/loc/as.h index 9990305..df00119 100644 --- a/src/loc/as.h +++ b/src/loc/as.h @@ -42,6 +42,8 @@ int loc_as_new_from_database_v0(struct loc_ctx* ctx, struct loc_stringpool* pool int loc_as_to_database_v0(struct loc_as* as, struct loc_stringpool* pool, struct loc_database_as_v0* dbobj); +int loc_as_match_string(struct loc_as* as, const char* string); + #endif #endif diff --git a/src/loc/database.h b/src/loc/database.h index e126f78..37810eb 100644 --- a/src/loc/database.h +++ b/src/loc/database.h @@ -48,4 +48,7 @@ int loc_database_enumerator_new(struct loc_database_enumerator** enumerator, str struct loc_database_enumerator* loc_database_enumerator_ref(struct loc_database_enumerator* enumerator); struct loc_database_enumerator* loc_database_enumerator_unref(struct loc_database_enumerator* enumerator); +int loc_database_enumerator_set_string(struct loc_database_enumerator* enumerator, const char* string); +struct loc_as* loc_database_enumerator_next_as(struct loc_database_enumerator* enumerator); + #endif diff --git a/src/test-as.c b/src/test-as.c index 08c8730..8010a90 100644 --- a/src/test-as.c +++ b/src/test-as.c @@ -95,6 +95,25 @@ int main(int argc, char** argv) { loc_as_unref(as); } + // Enumerator + + struct loc_database_enumerator* enumerator; + err = loc_database_enumerator_new(&enumerator, db); + if (err) { + fprintf(stderr, "Could not create a database enumerator\n"); + exit(EXIT_FAILURE); + } + + loc_database_enumerator_set_string(enumerator, "10"); + + as = loc_database_enumerator_next_as(enumerator); + while (as) { + printf("Found AS%d: %s\n", loc_as_get_number(as), loc_as_get_name(as)); + + as = loc_database_enumerator_next_as(enumerator); + } + + loc_database_enumerator_unref(enumerator); loc_database_unref(db); loc_unref(ctx); -- 2.39.5