]> granicus.if.org Git - vnstat/commitdiff
allow enforcing database output with --force even if database content doesn't pass...
authorTeemu Toivola <git@humdi.net>
Tue, 20 Dec 2016 22:26:35 +0000 (00:26 +0200)
committerTeemu Toivola <git@humdi.net>
Tue, 20 Dec 2016 22:26:35 +0000 (00:26 +0200)
src/daemon.c
src/dbaccess.c
src/dbaccess.h
src/dbmerge.c
src/vnstat.c
src/vnstati.c
tests/database_tests.c

index aa8a7f0d42450faa0d7d7631f31836eed49541d4..a4b5d4d0377fe6cd31978cafd7b9aa190c3213d3 100644 (file)
@@ -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;
                }
index e896ec657949378ede91462ab25ba8ac20dbf4d0..33b939c526a6f5584aaa6ef68c9a0e2f4b5d48f3 100644 (file)
@@ -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);
        }
 
index 9345b3acc4e1ce166cbeba230359d97384f9ad72..d7955bd67fbe224429f5b9f3033c17ab4508afc3 100644 (file)
@@ -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);
index 042102f058e319cb1010cc750dfe573596139d44..8351c8ee272289249bd543459d17a607efbaadf5 100644 (file)
@@ -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;
                }
index 1fa5eb153355aa45e84a08c70cd12f403b0d60fa..8d4508d4290aa71c0b60aa7729ab348fce19199b 100644 (file)
@@ -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;
index 7b703db7bcb2bad831f2c4930b188de0070b3d57..3b42fcb127ebb241ffe47540ec87a05b777aa22d 100644 (file)
@@ -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);
                }
        }
index 9cd5a28999f1ee424b286b49a22f20a07151886f..67b15c0f51bb316c6a00366a3c8d71e8698e86d1 100644 (file)
@@ -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");
 }