void filldatabaselist(DSTATE *s) { DIR *dir; struct dirent *di; if ((dir=opendir(s->dirname))==NULL) { snprintf(errorstring, 512, "Unable to access database directory \"%s\" (%s), exiting.", s->dirname, strerror(errno)); printe(PT_Error); /* clean daemon stuff before exit */ if (s->rundaemon && !debug) { close(pidfile); unlink(cfg.pidfile); } ibwflush(); exit(EXIT_FAILURE); } while ((di=readdir(dir))) { if ((di->d_name[0]=='.') || (strcmp(di->d_name, DATABASEFILE)==0)) { continue; } if (debug) { printf("\nProcessing file \"%s/%s\"...\n", s->dirname, di->d_name); } if (!cacheadd(di->d_name, s->sync)) { snprintf(errorstring, 512, "Cache memory allocation failed, exiting."); printe(PT_Error); /* clean daemon stuff before exit */ if (s->rundaemon && !debug) { close(pidfile); unlink(cfg.pidfile); } ibwflush(); exit(EXIT_FAILURE); } s->dbcount++; } closedir(dir); s->sync = 0; /* disable update interval check for one loop if database list was refreshed */ /* otherwise increase default update interval since there's nothing else to do */ if (s->dbcount) { s->updateinterval = 0; intsignal = 42; s->prevdbsave = s->current; /* list monitored interfaces to log */ cachestatus(); } else { s->updateinterval = 120; } }
int datalist_timevalidation(DSTATE *s) { if (s->current >= data.lastupdated) { data.lastupdated = s->current; cacheupdate(); return 1; } /* skip update if previous update is less than a day in the future */ /* otherwise exit with error message since the clock is problably messed */ if (data.lastupdated > (s->current+86400)) { snprintf(errorstring, 512, "Interface \"%s\" has previous update date too much in the future, exiting. (%d / %d)", data.interface, (unsigned int)data.lastupdated, (unsigned int)s->current); printe(PT_Error); /* clean daemon stuff before exit */ if (s->rundaemon && !debug) { close(pidfile); unlink(cfg.pidfile); } ibwflush(); exit(EXIT_FAILURE); } return 0; }
END_TEST START_TEST(ibwflush_success) { cfg.maxbw = 0; ck_assert_int_eq(ibwadd("name1", 1), 1); ck_assert_int_eq(ibwadd("name2", 2), 1); ck_assert_int_eq(ibwget("name1"), 1); ck_assert_int_eq(ibwget("name2"), 2); ck_assert_int_eq(ibwget("does_not_exist"), -1); ibwflush(); ck_assert_int_eq(ibwget("name1"), -1); ck_assert_int_eq(ibwget("name2"), -1); ck_assert_int_eq(ibwget("does_not_exist"), -1); ck_assert_int_eq(ibwadd("name1", 1), 1); ck_assert_int_eq(ibwadd("name2", 2), 1); ck_assert_int_eq(ibwget("name1"), 1); ck_assert_int_eq(ibwget("name2"), 2); ck_assert_int_eq(ibwget("does_not_exist"), -1); }
void defaultcfg(void) { ibwflush(); cfg.bvar = BVAR; cfg.qmode = DEFQMODE; cfg.sampletime = DEFSAMPTIME; cfg.monthrotate = MONTHROTATE; cfg.unit = UNITMODE; cfg.ostyle = OSTYLE; cfg.rateunit = RATEUNIT; cfg.maxbw = DEFMAXBW; cfg.spacecheck = USESPACECHECK; cfg.flock = USEFLOCK; cfg.hourlyrate = HOURLYRATE; cfg.summaryrate = SUMMARYRATE; cfg.slayout = SUMMARYLAYOUT; cfg.traflessday = TRAFLESSDAY; strncpy_nt(cfg.dbdir, DATABASEDIR, 512); strncpy_nt(cfg.iface, DEFIFACE, 32); strncpy_nt(cfg.locale, LOCALE, 32); strncpy_nt(cfg.dformat, DFORMAT, 64); strncpy_nt(cfg.mformat, MFORMAT, 64); strncpy_nt(cfg.tformat, TFORMAT, 64); strncpy_nt(cfg.hformat, HFORMAT, 64); strncpy_nt(cfg.rxchar, RXCHAR, 2); strncpy_nt(cfg.txchar, TXCHAR, 2); strncpy_nt(cfg.rxhourchar, RXHOURCHAR, 2); strncpy_nt(cfg.txhourchar, TXHOURCHAR, 2); cfg.daemonuser[0] = '\0'; cfg.daemongroup[0] = '\0'; cfg.updateinterval = UPDATEINTERVAL; cfg.pollinterval = POLLINTERVAL; cfg.saveinterval = SAVEINTERVAL; cfg.offsaveinterval = OFFSAVEINTERVAL; cfg.savestatus = SAVESTATUS; cfg.uselogging = USELOGGING; cfg.createdirs = CREATEDIRS; cfg.updatefileowner = UPDATEFILEOWNER; strncpy_nt(cfg.logfile, LOGFILE, 512); strncpy_nt(cfg.pidfile, PIDFILE, 512); cfg.transbg = TRANSBG; strncpy_nt(cfg.cbg, CBACKGROUND, 8); strncpy_nt(cfg.cedge, CEDGE, 8); strncpy_nt(cfg.cheader, CHEADER, 8); strncpy_nt(cfg.cheadertitle, CHEADERTITLE, 8); strncpy_nt(cfg.cheaderdate, CHEADERDATE, 8); strncpy_nt(cfg.ctext, CTEXT, 8); strncpy_nt(cfg.cline, CLINE, 8); strncpy_nt(cfg.clinel, CLINEL, 8); strncpy_nt(cfg.crx, CRX, 8); strncpy_nt(cfg.crxd, CRXD, 8); strncpy_nt(cfg.ctx, CTX, 8); strncpy_nt(cfg.ctxd, CTXD, 8); }
void handleintsignals(DSTATE *s) { switch (intsignal) { case SIGHUP: snprintf(errorstring, 512, "SIGHUP received, flushing data to disk and reloading config."); printe(PT_Info); cacheflush(s->dirname); s->dbcount = 0; ibwflush(); if (loadcfg(s->cfgfile)) { strncpy_nt(s->dirname, cfg.dbdir, 512); } ibwloadcfg(s->cfgfile); break; case SIGINT: snprintf(errorstring, 512, "SIGINT received, exiting."); printe(PT_Info); s->running = 0; break; case SIGTERM: snprintf(errorstring, 512, "SIGTERM received, exiting."); printe(PT_Info); s->running = 0; break; case 42: break; case 0: break; default: snprintf(errorstring, 512, "Unkown signal %d received, ignoring.", intsignal); printe(PT_Info); break; } intsignal = 0; }