Lesser General Public License for more details.
*/
+#include <ctype.h>
#include <endian.h>
#include <errno.h>
#include <stdint.h>
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;
+}
*/
#include <arpa/inet.h>
+#include <ctype.h>
#include <endian.h>
#include <errno.h>
#include <netinet/in.h>
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) {
loc_database_unref(enumerator->db);
loc_unref(enumerator->ctx);
+ if (enumerator->string)
+ free(enumerator->string);
+
free(enumerator);
}
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;
+}
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;
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
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
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);