#include <ctype.h>
#include <errno.h>
#include <unistd.h>
+#include <syslog.h>
-#include <loc/libloc.h>
-#include <loc/database.h>
-#include <loc/writer.h>
+#include <libloc/libloc.h>
+#include <libloc/database.h>
+#include <libloc/writer.h>
const char* VENDOR = "Test Vendor";
const char* DESCRIPTION =
"Maecenas ut venenatis nunc.";
const char* LICENSE = "CC";
+const char* networks[] = {
+ "2001:db8::/32",
+ "2001:db8:1000::/48",
+ "2001:db8:2000::/48",
+ "2001:db8:2020::/48",
+ NULL,
+};
+
+static int attempt_to_open(struct loc_ctx* ctx, char* path) {
+ FILE* f = fopen(path, "r");
+ if (!f)
+ return -1;
+
+ struct loc_database* db;
+ int r = loc_database_new(ctx, &db, f);
+
+ if (r == 0) {
+ fprintf(stderr, "Opening %s was unexpectedly successful\n", path);
+ loc_database_unref(db);
+
+ r = 1;
+ }
+
+ // Close the file again
+ fclose(f);
+
+ return r;
+}
+
int main(int argc, char** argv) {
int err;
if (err < 0)
exit(EXIT_FAILURE);
+ // Enable debug logging
+ loc_set_log_priority(ctx, LOG_DEBUG);
+
+ // Try opening an empty file
+ err = attempt_to_open(ctx, "/dev/null");
+ if (err == 0)
+ exit(EXIT_FAILURE);
+
+ // Try opening a file with all zeroes
+ err = attempt_to_open(ctx, "/dev/zero");
+ if (err == 0)
+ exit(EXIT_FAILURE);
+
+ // Try opening a file with random data
+ err = attempt_to_open(ctx, "/dev/urandom");
+ if (err == 0)
+ exit(EXIT_FAILURE);
+
// Create a database
struct loc_writer* writer;
- err = loc_writer_new(ctx, &writer, LOC_DATABASE_VERSION_LATEST, NULL);
+ err = loc_writer_new(ctx, &writer, NULL, NULL);
if (err < 0)
exit(EXIT_FAILURE);
exit(EXIT_FAILURE);
}
- FILE* f = fopen("test.db", "w+");
+ struct loc_network* network = NULL;
+
+ // Add some networks
+ const char** n = networks;
+ while (*n) {
+ err = loc_writer_add_network(writer, &network, *n);
+ if (err) {
+ fprintf(stderr, "Could not add network %s\n", *n);
+ exit(EXIT_FAILURE);
+ }
+
+ // Set a country
+ loc_network_set_country_code(network, "XX");
+
+ // Next one
+ n++;
+ }
+
+ FILE* f = tmpfile();
if (!f) {
- fprintf(stderr, "Could not open file for writing: %s\n", strerror(errno));
+ fprintf(stderr, "Could not open file for writing: %m\n");
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));
+ fprintf(stderr, "Could not write database: %m\n");
exit(EXIT_FAILURE);
}
loc_writer_unref(writer);
- // Close the file
- fclose(f);
-
// And open it again from disk
- f = fopen("test.db", "r");
- if (!f) {
- fprintf(stderr, "Could not open file for reading: %s\n", strerror(errno));
- exit(EXIT_FAILURE);
- }
-
struct loc_database* db;
err = loc_database_new(ctx, &db, f);
if (err) {
- fprintf(stderr, "Could not open database: %s\n", strerror(-err));
+ fprintf(stderr, "Could not open database: %m\n");
exit(EXIT_FAILURE);
}
exit(EXIT_FAILURE);
}
+ // Enumerator
+ struct loc_database_enumerator* enumerator;
+ err = loc_database_enumerator_new(&enumerator, db, LOC_DB_ENUMERATE_NETWORKS, 0);
+ if (err) {
+ fprintf(stderr, "Could not initialise the enumerator: %d\n", err);
+ exit(EXIT_FAILURE);
+ }
+
+ // Walk through all networks
+ while (1) {
+ err = loc_database_enumerator_next_network(enumerator, &network);
+ if (err) {
+ fprintf(stderr, "Error fetching the next network: %d\n", err);
+ exit(EXIT_FAILURE);
+ }
+
+ if (!network)
+ break;
+
+ const char* s = loc_network_str(network);
+ printf("Got network: %s\n", s);
+ }
+
+ // Free the enumerator
+ loc_database_enumerator_unref(enumerator);
+
// Close the database
loc_database_unref(db);
-
loc_unref(ctx);
+ fclose(f);
return EXIT_SUCCESS;
}