From: Teemu Toivola Date: Tue, 20 Dec 2016 22:26:35 +0000 (+0200) Subject: allow enforcing database output with --force even if database content doesn't pass... X-Git-Tag: v1.16~6 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=00b83fda0724639a41d129eb836e70d89807b527;p=vnstat allow enforcing database output with --force even if database content doesn't pass validation --- diff --git a/src/daemon.c b/src/daemon.c index aa8a7f0..a4b5d4d 100644 --- a/src/daemon.c +++ b/src/daemon.c @@ -415,7 +415,7 @@ int datalist_cacheget(DSTATE *s) if (cacheget(s->datalist)==0) { /* try to read data from file if not cached */ - if (readdb(s->datalist->data.interface, s->dirname)==0) { + if (readdb(s->datalist->data.interface, s->dirname, 0)==0) { /* mark cache as filled on read success and force interface status update */ s->datalist->filled = 1; s->dbhash = 0; @@ -489,10 +489,10 @@ int datalist_writedb(DSTATE *s) return 0; } - if (!validatedb()) { /* TODO: write test to simulate corrupted cached data */ + if (!validatedb()) { snprintf(errorstring, 512, "Cached data for interface \"%s\" failed validation. Reloading data from file.", s->datalist->data.interface); printe(PT_Error); - if (readdb(s->datalist->data.interface, s->dirname)==0) { + if (readdb(s->datalist->data.interface, s->dirname, 0)==0) { cacheupdate(); return 1; } diff --git a/src/dbaccess.c b/src/dbaccess.c index e896ec6..33b939c 100644 --- a/src/dbaccess.c +++ b/src/dbaccess.c @@ -2,7 +2,7 @@ #include "fs.h" #include "dbaccess.h" -int readdb(const char *iface, const char *dirname) +int readdb(const char *iface, const char *dirname, const int force) { FILE *db; char file[512], backup[512]; @@ -39,7 +39,7 @@ int readdb(const char *iface, const char *dirname) } if (data.version == DBVERSION) { - if (!validatedb()) { + if (!validatedb() && !force) { data.version=-1; if (debug) { printf("db: Database for interface \"%s\" fails to validate, trying with backup\n", data.interface); @@ -548,7 +548,7 @@ void cleartop10(const char *iface, const char *dirname) { int i; - if (readdb(iface, dirname)!=0) { + if (readdb(iface, dirname, 0)!=0) { exit(EXIT_FAILURE); } @@ -566,7 +566,7 @@ void rebuilddbtotal(const char *iface, const char *dirname) { int i; - if (readdb(iface, dirname)!=0) { + if (readdb(iface, dirname, 0)!=0) { exit(EXIT_FAILURE); } diff --git a/src/dbaccess.h b/src/dbaccess.h index 9345b3a..d7955bd 100644 --- a/src/dbaccess.h +++ b/src/dbaccess.h @@ -1,7 +1,7 @@ #ifndef DBACCESS_H #define DBACCESS_H -int readdb(const char *iface, const char *dirname); +int readdb(const char *iface, const char *dirname, const int force); void initdb(void); int writedb(const char *iface, const char *dirname, int newdb); int backupdb(const char *current, const char *backup); diff --git a/src/dbmerge.c b/src/dbmerge.c index 042102f..8351c8e 100644 --- a/src/dbmerge.c +++ b/src/dbmerge.c @@ -26,7 +26,7 @@ int mergedb(char iface[], char dirname[]) if (debug) printf("merging %s:\n", ifaceptr); - if (readdb(ifaceptr, dirname)!=0) { + if (readdb(ifaceptr, dirname, 0)!=0) { printf("Merge \"%s\" failed.\n", mergedata.interface); return 0; } diff --git a/src/vnstat.c b/src/vnstat.c index 1fa5eb1..8d4508d 100644 --- a/src/vnstat.c +++ b/src/vnstat.c @@ -198,7 +198,7 @@ int main(int argc, char *argv[]) { } else if ((strcmp(argv[currentarg],"-h")==0) || (strcmp(argv[currentarg],"--hours")==0)) { cfg.qmode=7; } else if ((strcmp(argv[currentarg],"--exportdb")==0) || (strcmp(argv[currentarg],"--dumpdb")==0)) { - cfg.qmode=4; /* TODO: provide some way of forcing export even if database doesn't validate */ + cfg.qmode=4; } else if (strcmp(argv[currentarg],"--oneline")==0) { cfg.qmode=9; } else if (strcmp(argv[currentarg],"--xml")==0) { @@ -431,7 +431,7 @@ void initparams(PARAMS *p) int synccounters(const char *iface, const char *dirname) { - readdb(iface, dirname); + readdb(iface, dirname, 0); if (!getifinfo(iface)) { printf("Error: Unable to sync unavailable interface \"%s\".", iface); return 0; @@ -549,7 +549,7 @@ void handlecounterreset(PARAMS *p) printf("Error: Not enough free diskspace available.\n"); exit(EXIT_FAILURE); } - readdb(p->interface, p->dirname); + readdb(p->interface, p->dirname, 0); data.currx=0; data.curtx=0; writedb(p->interface, p->dirname, 0); @@ -686,7 +686,7 @@ void handleenabledisable(PARAMS *p) printf("Error: Not enough free diskspace available.\n"); exit(EXIT_FAILURE); } - p->newdb=readdb(p->interface, p->dirname); + p->newdb=readdb(p->interface, p->dirname, 0); if (!data.active && !p->newdb) { data.active=1; writedb(p->interface, p->dirname, 0); @@ -700,7 +700,7 @@ void handleenabledisable(PARAMS *p) printf("Error: Not enough free diskspace available.\n"); exit(EXIT_FAILURE); } - p->newdb=readdb(p->interface, p->dirname); + p->newdb=readdb(p->interface, p->dirname, 0); if (data.active && !p->newdb) { data.active=0; writedb(p->interface, p->dirname, 0); @@ -787,7 +787,7 @@ void handleupdate(PARAMS *p) strncpy_nt(p->interface, di->d_name, 32); if (debug) printf("\nProcessing file \"%s/%s\"...\n", p->dirname, p->interface); - p->newdb=readdb(p->interface, p->dirname); + p->newdb=readdb(p->interface, p->dirname, 0); if (!data.active) { if (debug) @@ -830,7 +830,7 @@ void handleupdate(PARAMS *p) /* update only selected file */ } else { - p->newdb=readdb(p->interface, p->dirname); + p->newdb=readdb(p->interface, p->dirname, 0); if (!data.active) { if (debug) @@ -910,7 +910,7 @@ void handleshowdatabases(PARAMS *p) strncpy_nt(p->interface, di->d_name, 32); if (debug) printf("\nProcessing file \"%s/%s\"...\n", p->dirname, p->interface); - p->newdb=readdb(p->interface, p->dirname); + p->newdb=readdb(p->interface, p->dirname, p->force); if (p->newdb) { continue; } @@ -939,7 +939,7 @@ void handleshowdatabases(PARAMS *p) void showoneinterface(PARAMS *p, const char *interface) { if (!p->merged) { - p->newdb=readdb(interface, p->dirname); + p->newdb=readdb(interface, p->dirname, p->force); } if (p->newdb) { return; diff --git a/src/vnstati.c b/src/vnstati.c index 7b703db..3b42fcb 100644 --- a/src/vnstati.c +++ b/src/vnstati.c @@ -326,7 +326,7 @@ void handledatabase(IPARAMS *p) exit(EXIT_FAILURE); } } else { - if (readdb(p->interface, p->dirname)==1) { + if (readdb(p->interface, p->dirname, 0)==1) { exit(EXIT_FAILURE); } } diff --git a/tests/database_tests.c b/tests/database_tests.c index 9cd5a28..67b15c0 100644 --- a/tests/database_tests.c +++ b/tests/database_tests.c @@ -492,7 +492,7 @@ START_TEST(readdb_with_empty_file) cfg.flock = 1; ck_assert_int_eq(clean_testdbdir(), 1); ck_assert_int_eq(create_zerosize_dbfile("existingdb"), 1); - ck_assert_int_eq(readdb("existingdb", TESTDBDIR), -1); + ck_assert_int_eq(readdb("existingdb", TESTDBDIR, 0), -1); } END_TEST @@ -503,7 +503,7 @@ START_TEST(readdb_with_empty_file_and_backup) ck_assert_int_eq(clean_testdbdir(), 1); ck_assert_int_eq(create_zerosize_dbfile("existingdb"), 1); ck_assert_int_eq(create_zerosize_dbfile(".existingdb"), 1); - ck_assert_int_eq(readdb("existingdb", TESTDBDIR), -1); + ck_assert_int_eq(readdb("existingdb", TESTDBDIR, 0), -1); } END_TEST @@ -513,7 +513,7 @@ START_TEST(readdb_with_nonexisting_file) cfg.flock = 1; strcpy(data.interface, "none"); ck_assert_int_eq(clean_testdbdir(), 1); - ck_assert_int_eq(readdb("existingdb", TESTDBDIR), 1); + ck_assert_int_eq(readdb("existingdb", TESTDBDIR, 0), 1); ck_assert_str_eq(data.interface, "existingdb"); ck_assert_str_eq(data.nick, "existingdb"); } @@ -530,7 +530,7 @@ START_TEST(readdb_with_existing_dbfile) ck_assert_int_eq(check_dbfile_exists("ethtest", sizeof(DATA)), 1); strcpy(data.interface, "none"); - ck_assert_int_eq(readdb("ethtest", TESTDBDIR), 0); + ck_assert_int_eq(readdb("ethtest", TESTDBDIR, 0), 0); ck_assert_str_eq(data.interface, "ethtest"); } END_TEST @@ -546,7 +546,7 @@ START_TEST(readdb_with_existing_dbfile_and_max_name_length) ck_assert_int_eq(check_dbfile_exists("1234567890123456789012345678901", sizeof(DATA)), 1); strcpy(data.interface, "none"); - ck_assert_int_eq(readdb("1234567890123456789012345678901", TESTDBDIR), 0); + ck_assert_int_eq(readdb("1234567890123456789012345678901", TESTDBDIR, 0), 0); ck_assert_str_eq(data.interface, "1234567890123456789012345678901"); } END_TEST @@ -564,7 +564,7 @@ START_TEST(readdb_with_existing_dbfile_with_rename) strcpy(data.interface, "none"); strcpy(data.nick, "none"); - ck_assert_int_eq(readdb("ethtest2", TESTDBDIR), 0); + ck_assert_int_eq(readdb("ethtest2", TESTDBDIR, 0), 0); ck_assert_str_eq(data.interface, "ethtest2"); ck_assert_str_eq(data.nick, "ethtest2"); } @@ -583,7 +583,7 @@ START_TEST(readdb_with_existing_dbfile_and_over_max_name_length) strcpy(data.interface, "none"); strcpy(data.nick, "none"); - ck_assert_int_eq(readdb("1234567890123456789012345678901XX", TESTDBDIR), 0); + ck_assert_int_eq(readdb("1234567890123456789012345678901XX", TESTDBDIR, 0), 0); ck_assert_str_eq(data.interface, "1234567890123456789012345678901"); ck_assert_str_eq(data.nick, "1234567890123456789012345678901"); }