END_TEST START_TEST(validatedb_with_initdb) { initdb(); strcpy(data.interface, "ethtest"); ck_assert_int_eq(validatedb(), 1); }
END_TEST START_TEST(validatedb_with_invalid_totals) { initdb(); suppress_output(); strcpy(data.interface, "ethtest"); data.day[0].rx++; ck_assert_int_eq(validatedb(), 0); }
END_TEST START_TEST(validatedb_with_top10_use) { initdb(); suppress_output(); strcpy(data.interface, "ethtest"); data.top10[0].used = 1; data.top10[1].used = 1; data.top10[2].used = 1; data.top10[5].used = 1; ck_assert_int_eq(validatedb(), 0); }
int readdb(DATA *data, const char *iface, const char *dirname, const int force) { FILE *legacydb; char file[512], backup[512]; snprintf(file, 512, "%s/%s", dirname, iface); snprintf(backup, 512, "%s/.%s", dirname, iface); if ((legacydb = fopen(file, "r")) == NULL) { snprintf(errorstring, 1024, "Unable to read database \"%s\": %s", file, strerror(errno)); printe(PT_Error); /* create new database template */ initdb(data); strncpy_nt(data->interface, iface, 32); strncpy_nt(data->nick, data->interface, 32); return 1; } if (fread(data, sizeof(DATA), 1, legacydb) != 1 || ferror(legacydb)) { data->version = -1; if (debug) { printf("db: Database read failed for file \"%s\".\n", file); } } else { if (debug) { data->interface[sizeof(data->interface) - 1] = '\0'; printf("db: Database loaded for interface \"%s\"...\n", data->interface); } } data->interface[sizeof(data->interface) - 1] = '\0'; data->nick[sizeof(data->nick) - 1] = '\0'; if (data->version == LEGACYDBVERSION) { if (!validatedb(data) && !force) { data->version = -1; if (debug) { printf("db: Database for interface \"%s\" fails to validate, trying with backup\n", data->interface); } } } /* convert old database to new format if necessary */ if (data->version < LEGACYDBVERSION) { if (data->version == -1) { /* close current db and try using backup if database conversion failed */ fclose(legacydb); if ((legacydb = fopen(backup, "r")) == NULL) { snprintf(errorstring, 1024, "Unable to open backup database \"%s\": %s", backup, strerror(errno)); printe(PT_Error); if (noexit) { return -1; } else { exit(EXIT_FAILURE); } } if (fread(data, sizeof(DATA), 1, legacydb) != 1 || ferror(legacydb)) { snprintf(errorstring, 1024, "Database load failed even when using backup (%s). Aborting.", strerror(errno)); printe(PT_Error); fclose(legacydb); if (noexit) { return -1; } else { exit(EXIT_FAILURE); } } else { if (debug) { data->interface[sizeof(data->interface) - 1] = '\0'; printf("db: Backup database loaded for interface \"%s\"...\n", data->interface); } } data->interface[sizeof(data->interface) - 1] = '\0'; data->nick[sizeof(data->nick) - 1] = '\0'; if (data->version == LEGACYDBVERSION) { if (!validatedb(data)) { data->version = -1; if (debug) { printf("db: Backup database for interface \"%s\" fails to validate\n", data->interface); } } } if (data->version != LEGACYDBVERSION) { if (data->version == -1) { snprintf(errorstring, 1024, "Unable to use database \"%s\" or its backup.", file); printe(PT_Error); fclose(legacydb); if (noexit) { return -1; } else { exit(EXIT_FAILURE); } } } snprintf(errorstring, 1024, "Database possibly corrupted, using backup instead."); printe(PT_Info); } } else if (data->version > LEGACYDBVERSION) { snprintf(errorstring, 1024, "Downgrading database \"%s\" (v%d) is not supported.", file, data->version); printe(PT_Error); fclose(legacydb); if (noexit) { return -1; } else { exit(EXIT_FAILURE); } } fclose(legacydb); if (strcmp(data->interface, iface)) { snprintf(errorstring, 1024, "Warning:\nThe previous interface for this file was \"%s\".", data->interface); printe(PT_Multiline); snprintf(errorstring, 1024, "It has now been replaced with \"%s\".", iface); printe(PT_Multiline); snprintf(errorstring, 1024, "You can ignore this message if you renamed the filename."); printe(PT_Multiline); snprintf(errorstring, 1024, "Interface name mismatch, renamed \"%s\" -> \"%s\"", data->interface, iface); printe(PT_ShortMultiline); if (strcmp(data->interface, data->nick) == 0) { strncpy_nt(data->nick, iface, 32); } strncpy_nt(data->interface, iface, 32); } return 0; }