]> git.ipfire.org Git - location/libloc.git/blobdiff - src/test-network.c
export: Skip writing any subnets
[location/libloc.git] / src / test-network.c
index a573463b0d5ee2659d2ba79f55f6784a58069c96..c49c3ef4038a23c56bb75d136d275ced3b40fbc9 100644 (file)
 #include <stddef.h>
 #include <stdlib.h>
 #include <string.h>
+#include <syslog.h>
 
 #include <loc/libloc.h>
+#include <loc/database.h>
 #include <loc/network.h>
 #include <loc/writer.h>
 
@@ -32,6 +34,9 @@ int main(int argc, char** argv) {
        if (err < 0)
                exit(EXIT_FAILURE);
 
+       // Enable debug logging
+       loc_set_log_priority(ctx, LOG_DEBUG);
+
        struct loc_network_tree* tree;
        err = loc_network_tree_new(ctx, &tree);
        if (err) {
@@ -90,14 +95,27 @@ int main(int argc, char** argv) {
        size_t nodes = loc_network_tree_count_nodes(tree);
        printf("The tree has %zu nodes\n", nodes);
 
+       // Check subnet function
+       err = loc_network_is_subnet_of(network1, network2);
+       if (err != 0) {
+               fprintf(stderr, "Subnet check 1 failed: %d\n", err);
+               exit(EXIT_FAILURE);
+       }
+
+       err = loc_network_is_subnet_of(network2, network1);
+       if (err != 1) {
+               fprintf(stderr, "Subnet check 2 failed: %d\n", err);
+               exit(EXIT_FAILURE);
+       }
+
        // Create a database
        struct loc_writer* writer;
-       err = loc_writer_new(ctx, &writer);
+       err = loc_writer_new(ctx, &writer, NULL, NULL);
        if (err < 0)
                exit(EXIT_FAILURE);
 
        struct loc_network* network3;
-       err = loc_writer_add_network(writer, &network3, "2001:db8:1::/48");
+       err = loc_writer_add_network(writer, &network3, "2001:db8::/64");
        if (err) {
                fprintf(stderr, "Could not add network\n");
                exit(EXIT_FAILURE);
@@ -106,26 +124,64 @@ int main(int argc, char** argv) {
        // Set country code
        loc_network_set_country_code(network3, "XX");
 
-       FILE* f = fopen("test.db", "w");
+       struct loc_network* network4;
+       err = loc_writer_add_network(writer, &network4, "2001:db8:ffff::/64");
+       if (err) {
+               fprintf(stderr, "Could not add network\n");
+               exit(EXIT_FAILURE);
+       }
+
+       // Set country code
+       loc_network_set_country_code(network4, "XY");
+
+       // Set ASN
+       loc_network_set_asn(network4, 1024);
+
+       FILE* f = tmpfile();
        if (!f) {
                fprintf(stderr, "Could not open file for writing: %s\n", strerror(errno));
                exit(EXIT_FAILURE);
        }
 
-       err = loc_writer_write(writer, f);
+       err = loc_writer_write(writer, f, LOC_DATABASE_VERSION_UNSET);
        if (err) {
                fprintf(stderr, "Could not write database: %s\n", strerror(-err));
                exit(EXIT_FAILURE);
        }
-       fclose(f);
-
        loc_writer_unref(writer);
 
        loc_network_unref(network1);
        loc_network_unref(network2);
        loc_network_unref(network3);
+       loc_network_unref(network4);
        loc_network_tree_unref(tree);
+
+       // And open it again from disk
+       struct loc_database* db;
+       err = loc_database_new(ctx, &db, f);
+       if (err) {
+               fprintf(stderr, "Could not open database: %s\n", strerror(-err));
+               exit(EXIT_FAILURE);
+       }
+
+       // Lookup an address in the subnet
+       err = loc_database_lookup_from_string(db, "2001:db8::", &network1);
+       if (err) {
+               fprintf(stderr, "Could not look up 2001:db8::\n");
+               exit(EXIT_FAILURE);
+       }
+       loc_network_unref(network1);
+
+       // Lookup an address outside the subnet
+       err = loc_database_lookup_from_string(db, "2001:db8:fffe:1::", &network1);
+       if (err == 0) {
+               fprintf(stderr, "Could look up 2001:db8:fffe:1::, but I shouldn't\n");
+               exit(EXIT_FAILURE);
+       }
+       loc_network_unref(network1);
+
        loc_unref(ctx);
+       fclose(f);
 
        return EXIT_SUCCESS;
 }