FILE* f;
- unsigned int version;
+ enum loc_database_version version;
time_t created_at;
off_t vendor;
off_t description;
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;
}
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:
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)
// 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));
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);
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;
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;
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;