]> git.ipfire.org Git - people/ms/libloc.git/blobdiff - src/database.c
debian: Build for unstable
[people/ms/libloc.git] / src / database.c
index 443ed1eccf5aebf9493d921e7b38833914c56bfc..5fb411ba6ae3fa1b8e25b83f6758c8d7e32af0cf 100644 (file)
@@ -52,7 +52,7 @@ struct loc_database {
 
        FILE* f;
 
-       unsigned int version;
+       enum loc_database_version version;
        time_t created_at;
        off_t vendor;
        off_t description;
@@ -129,13 +129,12 @@ static int loc_database_read_magic(struct loc_database* db) {
                DEBUG(db->ctx, "Magic value matches\n");
 
                // Parse version
-               db->version = be16toh(magic.version);
-               DEBUG(db->ctx, "Database version is %u\n", db->version);
+               db->version = magic.version;
 
                return 0;
        }
 
-       ERROR(db->ctx, "Database format is not compatible\n");
+       ERROR(db->ctx, "Unrecognized file type\n");
 
        // Return an error
        return 1;
@@ -300,8 +299,10 @@ static int loc_database_read_header_v1(struct loc_database* db) {
 }
 
 static int loc_database_read_header(struct loc_database* db) {
+       DEBUG(db->ctx, "Database version is %u\n", db->version);
+
        switch (db->version) {
-               case 0:
+               case LOC_DATABASE_VERSION_1:
                        return loc_database_read_header_v1(db);
 
                default:
@@ -408,7 +409,8 @@ static void loc_database_free(struct loc_database* db) {
                        ERROR(db->ctx, "Could not unmap network nodes section: %s\n", strerror(errno));
        }
 
-       loc_stringpool_unref(db->pool);
+       if (db->pool)
+               loc_stringpool_unref(db->pool);
 
        // Free signature
        if (db->signature)
@@ -483,15 +485,23 @@ LOC_EXPORT int loc_database_verify(struct loc_database* db, FILE* f) {
 
        // Read the header
        struct loc_database_header_v1 header_v1;
+       size_t bytes_read;
 
        switch (db->version) {
-               case 0:
-                       fread(&header_v1, 1, sizeof(header_v1), db->f);
+               case LOC_DATABASE_VERSION_1:
+                       bytes_read = fread(&header_v1, 1, sizeof(header_v1), db->f);
+                       if (bytes_read < sizeof(header_v1)) {
+                               ERROR(db->ctx, "Could not read header\n");
+                               r = 1;
+
+                               goto CLEANUP;
+                       }
 
                        // Clear signature
                        for (unsigned int i = 0; i < sizeof(header_v1.signature); i++) {
                                header_v1.signature[i] = '\0';
                        }
+                       header_v1.signature_length = 0;
 
                        hexdump(db->ctx, &header_v1, sizeof(header_v1));
 
@@ -516,7 +526,7 @@ LOC_EXPORT int loc_database_verify(struct loc_database* db, FILE* f) {
        char buffer[64 * 1024];
 
        while (!feof(db->f)) {
-               size_t bytes_read = fread(buffer, 1, sizeof(buffer), db->f);
+               bytes_read = fread(buffer, 1, sizeof(buffer), db->f);
 
                hexdump(db->ctx, buffer, bytes_read);
 
@@ -589,7 +599,7 @@ static int loc_database_fetch_as(struct loc_database* db, struct loc_as** as, of
 
        int r;
        switch (db->version) {
-               case 0:
+               case LOC_DATABASE_VERSION_1:
                        r = loc_as_new_from_database_v1(db->ctx, db->pool, as, db->as_v1 + pos);
                        break;
 
@@ -662,7 +672,7 @@ static int loc_database_fetch_network(struct loc_database* db, struct loc_networ
 
        int r;
        switch (db->version) {
-               case 0:
+               case LOC_DATABASE_VERSION_1:
                        r = loc_network_new_from_database_v1(db->ctx, network,
                                address, prefix, db->networks_v1 + pos);
                        break;
@@ -806,7 +816,7 @@ static int loc_database_fetch_country(struct loc_database* db,
 
        int r;
        switch (db->version) {
-               case 0:
+               case LOC_DATABASE_VERSION_1:
                        r = loc_country_new_from_database_v1(db->ctx, db->pool, country, db->countries_v1 + pos);
                        break;