From: Teemu Toivola Date: Tue, 14 May 2019 19:41:54 +0000 (+0300) Subject: refactor interface list output X-Git-Tag: v2.3~22 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d9175ed83560ed1b48b316b2641f3368859c9eed;p=vnstat refactor interface list output --- diff --git a/Makefile.am b/Makefile.am index b1c5173..7431d99 100644 --- a/Makefile.am +++ b/Makefile.am @@ -14,6 +14,7 @@ vnstati_LDADD = @IMAGELIBS@ vnstat_SOURCES = src/vnstat.c src/vnstat.h \ src/ifinfo.c src/ifinfo.h \ + src/iflist.c src/iflist.h \ src/dbsql.c src/dbsql.h \ src/dbxml.c src/dbxml.h \ src/dbjson.c src/dbjson.h \ @@ -29,6 +30,7 @@ vnstat_SOURCES = src/vnstat.c src/vnstat.h \ vnstatd_SOURCES = src/vnstatd.c src/vnstatd.h \ src/ifinfo.c src/ifinfo.h \ + src/iflist.c src/iflist.h \ src/dbsql.c src/dbsql.h \ src/dbaccess.c src/dbaccess.h \ src/datacache.c src/datacache.h \ @@ -41,6 +43,7 @@ vnstatd_SOURCES = src/vnstatd.c src/vnstatd.h \ src/daemon.c src/daemon.h vnstati_SOURCES = src/vnstati.c src/vnstati.h \ + src/iflist.c src/iflist.h \ src/image.c src/image.h \ src/dbsql.c src/dbsql.h \ src/common.c src/common.h \ @@ -84,6 +87,7 @@ check_vnstat_SOURCES += src/cfg.c src/cfg.h \ src/dbxml.c src/dbxml.h \ src/ibw.c src/ibw.h \ src/ifinfo.c src/ifinfo.h \ + src/iflist.c src/iflist.h \ src/misc.c src/misc.h \ src/fs.c src/fs.h \ src/id.c src/id.h diff --git a/Makefile.in b/Makefile.in index 36ecf50..fada63c 100644 --- a/Makefile.in +++ b/Makefile.in @@ -129,9 +129,10 @@ am__check_vnstat_SOURCES_DIST = tests/vnstat_tests.c \ src/dbsql.c src/dbsql.h src/dbaccess.c src/dbaccess.h \ src/datacache.c src/datacache.h src/dbshow.c src/dbshow.h \ src/dbjson.c src/dbjson.h src/dbxml.c src/dbxml.h src/ibw.c \ - src/ibw.h src/ifinfo.c src/ifinfo.h src/misc.c src/misc.h \ - src/fs.c src/fs.h src/id.c src/id.h tests/image_tests.c \ - tests/image_tests.h src/image.c src/image.h + src/ibw.h src/ifinfo.c src/ifinfo.h src/iflist.c src/iflist.h \ + src/misc.c src/misc.h src/fs.c src/fs.h src/id.c src/id.h \ + tests/image_tests.c tests/image_tests.h src/image.c \ + src/image.h am__dirstamp = $(am__leading_dot)dirstamp @HAVE_CHECK_TRUE@@HAVE_LIBGD_TRUE@am__objects_1 = tests/check_vnstat-image_tests.$(OBJEXT) \ @HAVE_CHECK_TRUE@@HAVE_LIBGD_TRUE@ src/check_vnstat-image.$(OBJEXT) @@ -159,6 +160,7 @@ am__dirstamp = $(am__leading_dot)dirstamp @HAVE_CHECK_TRUE@ src/check_vnstat-dbxml.$(OBJEXT) \ @HAVE_CHECK_TRUE@ src/check_vnstat-ibw.$(OBJEXT) \ @HAVE_CHECK_TRUE@ src/check_vnstat-ifinfo.$(OBJEXT) \ +@HAVE_CHECK_TRUE@ src/check_vnstat-iflist.$(OBJEXT) \ @HAVE_CHECK_TRUE@ src/check_vnstat-misc.$(OBJEXT) \ @HAVE_CHECK_TRUE@ src/check_vnstat-fs.$(OBJEXT) \ @HAVE_CHECK_TRUE@ src/check_vnstat-id.$(OBJEXT) \ @@ -169,22 +171,25 @@ am__DEPENDENCIES_1 = check_vnstat_LINK = $(CCLD) $(check_vnstat_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ am_vnstat_OBJECTS = src/vnstat.$(OBJEXT) src/ifinfo.$(OBJEXT) \ - src/dbsql.$(OBJEXT) src/dbxml.$(OBJEXT) src/dbjson.$(OBJEXT) \ - src/dbshow.$(OBJEXT) src/common.$(OBJEXT) src/misc.$(OBJEXT) \ - src/cfg.$(OBJEXT) src/cfgoutput.$(OBJEXT) src/ibw.$(OBJEXT) \ - src/fs.$(OBJEXT) src/id.$(OBJEXT) src/traffic.$(OBJEXT) + src/iflist.$(OBJEXT) src/dbsql.$(OBJEXT) src/dbxml.$(OBJEXT) \ + src/dbjson.$(OBJEXT) src/dbshow.$(OBJEXT) src/common.$(OBJEXT) \ + src/misc.$(OBJEXT) src/cfg.$(OBJEXT) src/cfgoutput.$(OBJEXT) \ + src/ibw.$(OBJEXT) src/fs.$(OBJEXT) src/id.$(OBJEXT) \ + src/traffic.$(OBJEXT) vnstat_OBJECTS = $(am_vnstat_OBJECTS) vnstat_LDADD = $(LDADD) am_vnstatd_OBJECTS = src/vnstatd.$(OBJEXT) src/ifinfo.$(OBJEXT) \ - src/dbsql.$(OBJEXT) src/dbaccess.$(OBJEXT) \ - src/datacache.$(OBJEXT) src/common.$(OBJEXT) \ - src/misc.$(OBJEXT) src/cfg.$(OBJEXT) src/ibw.$(OBJEXT) \ - src/fs.$(OBJEXT) src/id.$(OBJEXT) src/daemon.$(OBJEXT) + src/iflist.$(OBJEXT) src/dbsql.$(OBJEXT) \ + src/dbaccess.$(OBJEXT) src/datacache.$(OBJEXT) \ + src/common.$(OBJEXT) src/misc.$(OBJEXT) src/cfg.$(OBJEXT) \ + src/ibw.$(OBJEXT) src/fs.$(OBJEXT) src/id.$(OBJEXT) \ + src/daemon.$(OBJEXT) vnstatd_OBJECTS = $(am_vnstatd_OBJECTS) vnstatd_LDADD = $(LDADD) -am_vnstati_OBJECTS = src/vnstati.$(OBJEXT) src/image.$(OBJEXT) \ - src/dbsql.$(OBJEXT) src/common.$(OBJEXT) src/misc.$(OBJEXT) \ - src/fs.$(OBJEXT) src/id.$(OBJEXT) src/cfg.$(OBJEXT) +am_vnstati_OBJECTS = src/vnstati.$(OBJEXT) src/iflist.$(OBJEXT) \ + src/image.$(OBJEXT) src/dbsql.$(OBJEXT) src/common.$(OBJEXT) \ + src/misc.$(OBJEXT) src/fs.$(OBJEXT) src/id.$(OBJEXT) \ + src/cfg.$(OBJEXT) vnstati_OBJECTS = $(am_vnstati_OBJECTS) vnstati_DEPENDENCIES = AM_V_P = $(am__v_P_@AM_V@) @@ -628,6 +633,7 @@ EXTRA_DIST = cfg examples UPGRADE CHANGES FAQ INSTALL_BSD UNINSTALL vnstati_LDADD = @IMAGELIBS@ vnstat_SOURCES = src/vnstat.c src/vnstat.h \ src/ifinfo.c src/ifinfo.h \ + src/iflist.c src/iflist.h \ src/dbsql.c src/dbsql.h \ src/dbxml.c src/dbxml.h \ src/dbjson.c src/dbjson.h \ @@ -643,6 +649,7 @@ vnstat_SOURCES = src/vnstat.c src/vnstat.h \ vnstatd_SOURCES = src/vnstatd.c src/vnstatd.h \ src/ifinfo.c src/ifinfo.h \ + src/iflist.c src/iflist.h \ src/dbsql.c src/dbsql.h \ src/dbaccess.c src/dbaccess.h \ src/datacache.c src/datacache.h \ @@ -655,6 +662,7 @@ vnstatd_SOURCES = src/vnstatd.c src/vnstatd.h \ src/daemon.c src/daemon.h vnstati_SOURCES = src/vnstati.c src/vnstati.h \ + src/iflist.c src/iflist.h \ src/image.c src/image.h \ src/dbsql.c src/dbsql.h \ src/common.c src/common.h \ @@ -689,8 +697,9 @@ vnstati_SOURCES = src/vnstati.c src/vnstati.h \ @HAVE_CHECK_TRUE@ src/datacache.h src/dbshow.c src/dbshow.h \ @HAVE_CHECK_TRUE@ src/dbjson.c src/dbjson.h src/dbxml.c \ @HAVE_CHECK_TRUE@ src/dbxml.h src/ibw.c src/ibw.h src/ifinfo.c \ -@HAVE_CHECK_TRUE@ src/ifinfo.h src/misc.c src/misc.h src/fs.c \ -@HAVE_CHECK_TRUE@ src/fs.h src/id.c src/id.h $(am__append_4) +@HAVE_CHECK_TRUE@ src/ifinfo.h src/iflist.c src/iflist.h \ +@HAVE_CHECK_TRUE@ src/misc.c src/misc.h src/fs.c src/fs.h \ +@HAVE_CHECK_TRUE@ src/id.c src/id.h $(am__append_4) all: all-recursive .SUFFIXES: @@ -920,6 +929,8 @@ src/check_vnstat-ibw.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/check_vnstat-ifinfo.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) +src/check_vnstat-iflist.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) src/check_vnstat-misc.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/check_vnstat-fs.$(OBJEXT): src/$(am__dirstamp) \ @@ -938,6 +949,8 @@ src/vnstat.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/ifinfo.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) +src/iflist.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) src/dbsql.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) src/dbxml.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) src/dbjson.$(OBJEXT): src/$(am__dirstamp) \ @@ -1003,6 +1016,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/check_vnstat-ibw.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/check_vnstat-id.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/check_vnstat-ifinfo.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/check_vnstat-iflist.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/check_vnstat-image.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/check_vnstat-misc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/common.Po@am__quote@ @@ -1017,6 +1031,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/ibw.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/id.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/ifinfo.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/iflist.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/image.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/misc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/traffic.Po@am__quote@ @@ -1374,6 +1389,20 @@ src/check_vnstat-ifinfo.obj: src/ifinfo.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(check_vnstat_CFLAGS) $(CFLAGS) -c -o src/check_vnstat-ifinfo.obj `if test -f 'src/ifinfo.c'; then $(CYGPATH_W) 'src/ifinfo.c'; else $(CYGPATH_W) '$(srcdir)/src/ifinfo.c'; fi` +src/check_vnstat-iflist.o: src/iflist.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(check_vnstat_CFLAGS) $(CFLAGS) -MT src/check_vnstat-iflist.o -MD -MP -MF src/$(DEPDIR)/check_vnstat-iflist.Tpo -c -o src/check_vnstat-iflist.o `test -f 'src/iflist.c' || echo '$(srcdir)/'`src/iflist.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/check_vnstat-iflist.Tpo src/$(DEPDIR)/check_vnstat-iflist.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/iflist.c' object='src/check_vnstat-iflist.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(check_vnstat_CFLAGS) $(CFLAGS) -c -o src/check_vnstat-iflist.o `test -f 'src/iflist.c' || echo '$(srcdir)/'`src/iflist.c + +src/check_vnstat-iflist.obj: src/iflist.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(check_vnstat_CFLAGS) $(CFLAGS) -MT src/check_vnstat-iflist.obj -MD -MP -MF src/$(DEPDIR)/check_vnstat-iflist.Tpo -c -o src/check_vnstat-iflist.obj `if test -f 'src/iflist.c'; then $(CYGPATH_W) 'src/iflist.c'; else $(CYGPATH_W) '$(srcdir)/src/iflist.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/check_vnstat-iflist.Tpo src/$(DEPDIR)/check_vnstat-iflist.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/iflist.c' object='src/check_vnstat-iflist.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(check_vnstat_CFLAGS) $(CFLAGS) -c -o src/check_vnstat-iflist.obj `if test -f 'src/iflist.c'; then $(CYGPATH_W) 'src/iflist.c'; else $(CYGPATH_W) '$(srcdir)/src/iflist.c'; fi` + src/check_vnstat-misc.o: src/misc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(check_vnstat_CFLAGS) $(CFLAGS) -MT src/check_vnstat-misc.o -MD -MP -MF src/$(DEPDIR)/check_vnstat-misc.Tpo -c -o src/check_vnstat-misc.o `test -f 'src/misc.c' || echo '$(srcdir)/'`src/misc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/check_vnstat-misc.Tpo src/$(DEPDIR)/check_vnstat-misc.Po diff --git a/src/daemon.c b/src/daemon.c index 36b8367..65ee9ba 100644 --- a/src/daemon.c +++ b/src/daemon.c @@ -1,5 +1,6 @@ #include "common.h" #include "ifinfo.h" +#include "iflist.h" #include "dbsql.h" #include "dbaccess.h" #include "datacache.h" @@ -122,7 +123,7 @@ unsigned int addinterfaces(DSTATE *s) timeused_debug(__func__, 1); /* get list of currently visible interfaces */ - if (getiflist(&ifacelist, 0) == 0) { + if (getifliststring(&ifacelist, 0) == 0) { free(ifacelist); return 0; } @@ -135,6 +136,7 @@ unsigned int addinterfaces(DSTATE *s) if (debug) printf("Interface list: \"%s\"\n", ifacelist); + // TODO: refactor to use list structure while (sscanf(ifacelist + index, "%31s", interface) != EOF) { if (debug) printf("Processing: \"%s\"\n", interface); @@ -711,7 +713,7 @@ void cleanremovedinterfaces(DSTATE *s) while (iterator != NULL) { if (!db_getinterfacecountbyname(iterator->interface)) { - iflistadd(&dbifl, iterator->interface, -1); + iflistadd(&dbifl, iterator->interface, 0); } iterator = iterator->next; } @@ -853,7 +855,7 @@ void interfacechangecheck(DSTATE *s) timeused_debug(__func__, 1); /* get list of currently visible interfaces */ - if (getiflist(&ifacelist, 0) == 0) { + if (getifliststring(&ifacelist, 0) == 0) { free(ifacelist); s->iflisthash = 0; return; diff --git a/src/dbsql.c b/src/dbsql.c index a8bbcd6..fcb8923 100644 --- a/src/dbsql.c +++ b/src/dbsql.c @@ -1,5 +1,6 @@ #include "common.h" #include "misc.h" +#include "iflist.h" #include "dbsql.h" /* global db */ @@ -703,7 +704,7 @@ int db_getiflist(iflist **ifl) if (sqlite3_column_text(sqlstmt, 0) == NULL) { continue; } - if (!iflistadd(ifl, (const char *)sqlite3_column_text(sqlstmt, 0), -1)) { + if (!iflistadd(ifl, (const char *)sqlite3_column_text(sqlstmt, 0), 0)) { break; } rc++; diff --git a/src/dbsql.h b/src/dbsql.h index 778fe5e..03d1388 100644 --- a/src/dbsql.h +++ b/src/dbsql.h @@ -2,7 +2,7 @@ #define DBSQL_H #include -#include "misc.h" +#include "iflist.h" typedef struct dbdatalist { time_t timestamp; diff --git a/src/ifinfo.c b/src/ifinfo.c index b531661..d1d915f 100644 --- a/src/ifinfo.c +++ b/src/ifinfo.c @@ -65,9 +65,57 @@ int getifinfo(const char *iface) return 0; } -int getiflist(char **ifacelist, int showspeed) +int getifliststring(char **ifacelist, int showspeed) +{ + char temp[64]; + iflist *ifl = NULL, *ifl_iterator = NULL; + + /* initialize list string */ + *ifacelist = (char *)malloc(sizeof(char)); + if (*ifacelist == NULL) { + panicexit(__FILE__, __LINE__); + } + *ifacelist[0] = '\0'; + + if (getiflist(&ifl, showspeed) > 0) { + + ifl_iterator = ifl; + + /* seek to end of list to show entries in original input order */ + while (ifl_iterator->next != NULL) { + ifl_iterator = ifl_iterator->next; + } + + while (ifl_iterator != NULL) { + *ifacelist = (char *)realloc(*ifacelist, ((strlen(*ifacelist) + strlen(ifl_iterator->interface) + 2) * sizeof(char))); + if (*ifacelist == NULL) { + panicexit(__FILE__, __LINE__); + } + strcat(*ifacelist, ifl_iterator->interface); + strcat(*ifacelist, " "); + + if (showspeed && ifl_iterator->bandwidth > 0) { + snprintf(temp, 64, "(%u Mbit) ", ifl_iterator->bandwidth); + *ifacelist = (char *)realloc(*ifacelist, ((strlen(*ifacelist) + strlen(temp) + 1) * sizeof(char))); + if (*ifacelist == NULL) { + panicexit(__FILE__, __LINE__); + } + strcat(*ifacelist, temp); + } + + ifl_iterator = ifl_iterator->prev; + } + + iflistfree(&ifl); + return 1; + } + + iflistfree(&ifl); + return 0; +} + +int getiflist(iflist **ifl, int getspeed) { - uint32_t speed; char temp[64]; #if defined(__linux__) || defined(CHECK_VNSTAT) char interface[32]; @@ -79,13 +127,6 @@ int getiflist(char **ifacelist, int showspeed) struct ifaddrs *ifap, *ifa; #endif - /* initialize list */ - *ifacelist = (char *)malloc(sizeof(char)); - if (*ifacelist == NULL) { - panicexit(__FILE__, __LINE__); - } - *ifacelist[0] = '\0'; - #if defined(__linux__) || defined(CHECK_VNSTAT) if ((fp = fopen(PROCNETDEV, "r")) != NULL) { @@ -94,23 +135,10 @@ int getiflist(char **ifacelist, int showspeed) sscanf(procline, "%63s", temp); if (strlen(temp) > 0 && (isdigit(temp[(strlen(temp) - 1)]) || temp[(strlen(temp) - 1)] == ':')) { sscanf(temp, "%31[^':']s", interface); - *ifacelist = (char *)realloc(*ifacelist, ((strlen(*ifacelist) + strlen(interface) + 2) * sizeof(char))); - if (*ifacelist == NULL) { - panicexit(__FILE__, __LINE__); - } - strcat(*ifacelist, interface); - strcat(*ifacelist, " "); - if (!showspeed) { - continue; - } - speed = getifspeed(interface); - if (speed > 0) { - snprintf(temp, 64, "(%u Mbit) ", speed); - *ifacelist = (char *)realloc(*ifacelist, ((strlen(*ifacelist) + strlen(temp) + 1) * sizeof(char))); - if (*ifacelist == NULL) { - panicexit(__FILE__, __LINE__); - } - strcat(*ifacelist, temp); + if (getspeed) { + iflistadd(ifl, interface, getifspeed(interface)); + } else { + iflistadd(ifl, interface, 0); } } } @@ -127,23 +155,10 @@ int getiflist(char **ifacelist, int showspeed) if (di->d_name[0] == '.' || strlen(di->d_name) > 31) { continue; } - *ifacelist = (char *)realloc(*ifacelist, ((strlen(*ifacelist) + strlen(di->d_name) + 2) * sizeof(char))); - if (*ifacelist == NULL) { - panicexit(__FILE__, __LINE__); - } - strcat(*ifacelist, di->d_name); - strcat(*ifacelist, " "); - if (!showspeed) { - continue; - } - speed = getifspeed(di->d_name); - if (speed > 0) { - snprintf(temp, 64, "(%u Mbit) ", speed); - *ifacelist = (char *)realloc(*ifacelist, ((strlen(*ifacelist) + strlen(temp) + 1) * sizeof(char))); - if (*ifacelist == NULL) { - panicexit(__FILE__, __LINE__); - } - strcat(*ifacelist, temp); + if (getspeed) { + iflistadd(ifl, di->d_name, getifspeed(di->d_name)); + } else { + iflistadd(ifl, di->d_name, 0); } } @@ -160,23 +175,10 @@ int getiflist(char **ifacelist, int showspeed) if (ifa->ifa_addr->sa_family != AF_LINK || strlen(ifa->ifa_name) > 31) { continue; } - *ifacelist = realloc(*ifacelist, ((strlen(*ifacelist) + strlen(ifa->ifa_name) + 2) * sizeof(char))); - if (*ifacelist == NULL) { - panicexit(__FILE__, __LINE__); - } - strcat(*ifacelist, ifa->ifa_name); - strcat(*ifacelist, " "); - if (!showspeed) { - continue; - } - speed = getifspeed(ifa->ifa_name); - if (speed > 0) { - snprintf(temp, 64, "(%u Mbit) ", speed); - *ifacelist = realloc(*ifacelist, ((strlen(*ifacelist) + strlen(temp) + 1) * sizeof(char))); - if (*ifacelist == NULL) { - panicexit(__FILE__, __LINE__); - } - strcat(*ifacelist, temp); + if (getspeed) { + iflistadd(ifl, ifa->ifa_name, getifspeed(ifa->ifa_name)); + } else { + iflistadd(ifl, ifa->ifa_name, 0); } } diff --git a/src/ifinfo.h b/src/ifinfo.h index 3ff9892..ff9cd0a 100644 --- a/src/ifinfo.h +++ b/src/ifinfo.h @@ -1,12 +1,15 @@ #ifndef IFINFO_H #define IFINFO_H +#include "iflist.h" + #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__APPLE__) || defined(__FreeBSD_kernel__) #include #endif int getifinfo(const char *iface); -int getiflist(char **ifacelist, int showspeed); +int getifliststring(char **ifacelist, int showspeed); +int getiflist(iflist **ifl, int getspeed); int readproc(const char *iface); int readsysclassnet(const char *iface); #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__APPLE__) || defined(__FreeBSD_kernel__) diff --git a/src/iflist.c b/src/iflist.c new file mode 100644 index 0000000..7bd6c7c --- /dev/null +++ b/src/iflist.c @@ -0,0 +1,37 @@ +#include "common.h" +#include "iflist.h" + +int iflistadd(iflist **ifl, const char *iface, const uint32_t bandwidth) +{ + iflist *newif; + + newif = malloc(sizeof(iflist)); + if (newif == NULL) { + return 0; + } + + newif->next = *ifl; + newif->prev = NULL; + + if (*ifl != NULL) { + (*ifl)->prev = newif; + } + + *ifl = newif; + + strncpy_nt(newif->interface, iface, 32); + newif->bandwidth = bandwidth; + + return 1; +} + +void iflistfree(iflist **ifl) +{ + iflist *ifl_prev; + + while (*ifl != NULL) { + ifl_prev = *ifl; + *ifl = (*ifl)->next; + free(ifl_prev); + } +} diff --git a/src/iflist.h b/src/iflist.h new file mode 100644 index 0000000..1437bf4 --- /dev/null +++ b/src/iflist.h @@ -0,0 +1,14 @@ +#ifndef IFLIST_H +#define IFLIST_H + +typedef struct iflist { + char interface[32]; + uint32_t bandwidth; + struct iflist *next; + struct iflist *prev; +} iflist; + +int iflistadd(iflist **ifl, const char *iface, const uint32_t bandwidth); +void iflistfree(iflist **ifl); + +#endif diff --git a/src/misc.c b/src/misc.c index fe480f2..aa4fc1d 100644 --- a/src/misc.c +++ b/src/misc.c @@ -444,31 +444,3 @@ int issametimeslot(const ListType listtype, const time_t entry, const time_t upd return 0; } - -int iflistadd(iflist **ifl, const char *iface, const int bandwidth) -{ - iflist *newif; - - newif = malloc(sizeof(iflist)); - if (newif == NULL) { - return 0; - } - - newif->next = *ifl; - *ifl = newif; - strncpy_nt(newif->interface, iface, 32); - newif->bandwidth = bandwidth; - - return 1; -} - -void iflistfree(iflist **ifl) -{ - iflist *ifl_prev; - - while (*ifl != NULL) { - ifl_prev = *ifl; - *ifl = (*ifl)->next; - free(ifl_prev); - } -} diff --git a/src/misc.h b/src/misc.h index 5e85000..b8e9f96 100644 --- a/src/misc.h +++ b/src/misc.h @@ -19,12 +19,6 @@ typedef enum ListType { LT_Top } ListType; -typedef struct iflist { - char interface[32]; - int bandwidth; - struct iflist *next; -} iflist; - int spacecheck(const char *path); void sighandler(int sig); uint64_t getbtime(void); @@ -44,7 +38,5 @@ void cursorshow(void); void eraseline(void); int validatedatetime(const char *str); int issametimeslot(const ListType listtype, const time_t entry, const time_t updated); -int iflistadd(iflist **ifl, const char *iface, const int bandwidth); -void iflistfree(iflist **ifl); #endif diff --git a/src/vnstat.c b/src/vnstat.c index 451c4fa..9e57de6 100644 --- a/src/vnstat.c +++ b/src/vnstat.c @@ -17,6 +17,7 @@ vnStat - Copyright (c) 2002-2019 Teemu Toivola #include "common.h" #include "ifinfo.h" +#include "iflist.h" #include "traffic.h" #include "dbsql.h" #include "dbxml.h" @@ -385,7 +386,7 @@ int main(int argc, char *argv[]) return 1; } } else if (strcmp(argv[currentarg], "--iflist") == 0) { - getiflist(&p.ifacelist, 1); + getifliststring(&p.ifacelist, 1); printf("Available interfaces: %s\n", p.ifacelist); free(p.ifacelist); return 0; @@ -462,7 +463,7 @@ int main(int argc, char *argv[]) /* give more help if there's no database */ if (p.ifcount == 0) { - getiflist(&p.ifacelist, 1); + getifliststring(&p.ifacelist, 1); printf("No interfaces found in the database, nothing to do. Use --help for help.\n\n"); printf("Interfaces can be added to the database with the following command:\n"); printf(" %s --add -i eth0\n\n", argv[0]); @@ -636,7 +637,7 @@ void handleaddinterface(PARAMS *p) } if (!p->force && !getifinfo(p->interface)) { - getiflist(&p->ifacelist, 1); + getifliststring(&p->ifacelist, 1); printf("Only available interfaces can be added for monitoring.\n\n"); printf("The following interfaces are currently available:\n %s\n", p->ifacelist); free(p->ifacelist); @@ -798,7 +799,7 @@ void handletrafficmeters(PARAMS *p) } if (!isifavailable(p->interface)) { - getiflist(&p->ifacelist, 0); + getifliststring(&p->ifacelist, 0); if (p->defaultiface) { printf("Error: Configured default interface \"%s\" isn't available.\n\n", p->interface); if (strlen(cfg.cfgfile)) { diff --git a/tests/daemon_tests.c b/tests/daemon_tests.c index 8e06c2b..6c01603 100644 --- a/tests/daemon_tests.c +++ b/tests/daemon_tests.c @@ -702,7 +702,7 @@ START_TEST(interfacechangecheck_with_no_changes_in_iflist) ck_assert_int_eq(remove_directory(TESTDIR), 1); fake_proc_net_dev("w", "ethsomething", 1, 2, 3, 4); fake_proc_net_dev("a", "ethelse", 5, 6, 7, 8); - ck_assert_int_ne(getiflist(&ifacelist, 0), 0); + ck_assert_int_ne(getifliststring(&ifacelist, 0), 0); ifhash = simplehash(ifacelist, (int)strlen(ifacelist)); s.iflisthash = ifhash; diff --git a/tests/ifinfo_tests.c b/tests/ifinfo_tests.c index ba09781..bd99507 100644 --- a/tests/ifinfo_tests.c +++ b/tests/ifinfo_tests.c @@ -7,21 +7,21 @@ #include "cfg.h" #include "ibw.h" -START_TEST(getiflist_no_source) +START_TEST(getifliststring_no_source) { char *ifacelist; linuxonly; ck_assert_int_eq(remove_directory(TESTDIR), 1); - ck_assert_int_eq(getiflist(&ifacelist, 0), 0); + ck_assert_int_eq(getifliststring(&ifacelist, 0), 0); ck_assert_str_eq(ifacelist, ""); free(ifacelist); } END_TEST -START_TEST(getiflist_proc_one_interface) +START_TEST(getifliststring_proc_one_interface) { char *ifacelist; @@ -30,14 +30,14 @@ START_TEST(getiflist_proc_one_interface) ck_assert_int_eq(remove_directory(TESTDIR), 1); fake_proc_net_dev("w", "ethunusual", 0, 0, 0, 0); - ck_assert_int_eq(getiflist(&ifacelist, 1), 1); + ck_assert_int_eq(getifliststring(&ifacelist, 1), 1); ck_assert_str_eq(ifacelist, "lo ethunusual "); free(ifacelist); } END_TEST -START_TEST(getiflist_proc_one_interface_with_speed) +START_TEST(getifliststring_proc_one_interface_with_speed) { char *ifacelist; @@ -47,14 +47,14 @@ START_TEST(getiflist_proc_one_interface_with_speed) fake_proc_net_dev("w", "ethunusual", 0, 0, 0, 0); fake_sys_class_net("ethunusual", 0, 0, 0, 0, 10); - ck_assert_int_eq(getiflist(&ifacelist, 1), 1); + ck_assert_int_eq(getifliststring(&ifacelist, 1), 1); ck_assert_str_eq(ifacelist, "lo ethunusual (10 Mbit) "); free(ifacelist); } END_TEST -START_TEST(getiflist_proc_multiple_interfaces) +START_TEST(getifliststring_proc_multiple_interfaces) { char *ifacelist; @@ -67,14 +67,14 @@ START_TEST(getiflist_proc_multiple_interfaces) fake_proc_net_dev("a", "fun", 0, 0, 0, 0); fake_proc_net_dev("a", "i", 0, 0, 0, 0); - ck_assert_int_eq(getiflist(&ifacelist, 0), 1); + ck_assert_int_eq(getifliststring(&ifacelist, 0), 1); ck_assert_str_eq(ifacelist, "lo random interfaces having fun i "); free(ifacelist); } END_TEST -START_TEST(getiflist_proc_long_interface_names) +START_TEST(getifliststring_proc_long_interface_names) { char *ifacelist; @@ -89,14 +89,14 @@ START_TEST(getiflist_proc_long_interface_names) fake_proc_net_dev("a", "longestinterfaceislongerthanshouldbeexpectedanywhereinanormallyfunctioningenvironment", 0, 0, 0, 0); fake_proc_net_dev("a", "a", 0, 0, 0, 0); - ck_assert_int_eq(getiflist(&ifacelist, 0), 1); + ck_assert_int_eq(getifliststring(&ifacelist, 0), 1); ck_assert_str_eq(ifacelist, "lo random interfaces having toomuchfun longinterfaceislong a "); free(ifacelist); } END_TEST -START_TEST(getiflist_sysclassnet_one_interface) +START_TEST(getifliststring_sysclassnet_one_interface) { char *ifacelist; @@ -105,14 +105,14 @@ START_TEST(getiflist_sysclassnet_one_interface) ck_assert_int_eq(remove_directory(TESTDIR), 1); fake_sys_class_net("ethunusual", 0, 0, 0, 0, 0); - ck_assert_int_eq(getiflist(&ifacelist, 1), 1); + ck_assert_int_eq(getifliststring(&ifacelist, 1), 1); ck_assert_str_eq(ifacelist, "ethunusual "); free(ifacelist); } END_TEST -START_TEST(getiflist_sysclassnet_one_interface_with_speed) +START_TEST(getifliststring_sysclassnet_one_interface_with_speed) { char *ifacelist; @@ -121,14 +121,14 @@ START_TEST(getiflist_sysclassnet_one_interface_with_speed) ck_assert_int_eq(remove_directory(TESTDIR), 1); fake_sys_class_net("ethunusual", 0, 0, 0, 0, 10); - ck_assert_int_eq(getiflist(&ifacelist, 1), 1); + ck_assert_int_eq(getifliststring(&ifacelist, 1), 1); ck_assert_str_eq(ifacelist, "ethunusual (10 Mbit) "); free(ifacelist); } END_TEST -START_TEST(getiflist_sysclassnet_multiple_interfaces) +START_TEST(getifliststring_sysclassnet_multiple_interfaces) { char *ifacelist; @@ -141,14 +141,14 @@ START_TEST(getiflist_sysclassnet_multiple_interfaces) fake_sys_class_net("fun", 0, 0, 0, 0, 0); fake_sys_class_net("i", 0, 0, 0, 0, 0); - ck_assert_int_eq(getiflist(&ifacelist, 0), 1); + ck_assert_int_eq(getifliststring(&ifacelist, 0), 1); ck_assert_int_eq(strlen(ifacelist), 31); free(ifacelist); } END_TEST -START_TEST(getiflist_sysclassnet_long_interface_names) +START_TEST(getifliststring_sysclassnet_long_interface_names) { char *ifacelist; @@ -163,7 +163,7 @@ START_TEST(getiflist_sysclassnet_long_interface_names) fake_sys_class_net("longestinterfaceislongerthanshouldbeexpectedanywhereinanormallyfunctioningenvironment", 0, 0, 0, 0, 0); fake_sys_class_net("a", 0, 0, 0, 0, 0); - ck_assert_int_eq(getiflist(&ifacelist, 0), 1); + ck_assert_int_eq(getifliststring(&ifacelist, 0), 1); ck_assert_int_eq(strlen(ifacelist), 58); free(ifacelist); @@ -288,15 +288,15 @@ END_TEST void add_ifinfo_tests(Suite *s) { TCase *tc_ifinfo = tcase_create("Ifinfo"); - tcase_add_test(tc_ifinfo, getiflist_no_source); - tcase_add_test(tc_ifinfo, getiflist_proc_one_interface); - tcase_add_test(tc_ifinfo, getiflist_proc_one_interface_with_speed); - tcase_add_test(tc_ifinfo, getiflist_proc_multiple_interfaces); - tcase_add_test(tc_ifinfo, getiflist_proc_long_interface_names); - tcase_add_test(tc_ifinfo, getiflist_sysclassnet_one_interface); - tcase_add_test(tc_ifinfo, getiflist_sysclassnet_one_interface_with_speed); - tcase_add_test(tc_ifinfo, getiflist_sysclassnet_multiple_interfaces); - tcase_add_test(tc_ifinfo, getiflist_sysclassnet_long_interface_names); + tcase_add_test(tc_ifinfo, getifliststring_no_source); + tcase_add_test(tc_ifinfo, getifliststring_proc_one_interface); + tcase_add_test(tc_ifinfo, getifliststring_proc_one_interface_with_speed); + tcase_add_test(tc_ifinfo, getifliststring_proc_multiple_interfaces); + tcase_add_test(tc_ifinfo, getifliststring_proc_long_interface_names); + tcase_add_test(tc_ifinfo, getifliststring_sysclassnet_one_interface); + tcase_add_test(tc_ifinfo, getifliststring_sysclassnet_one_interface_with_speed); + tcase_add_test(tc_ifinfo, getifliststring_sysclassnet_multiple_interfaces); + tcase_add_test(tc_ifinfo, getifliststring_sysclassnet_long_interface_names); tcase_add_test(tc_ifinfo, readproc_no_file); tcase_add_test(tc_ifinfo, readproc_not_found); tcase_add_test(tc_ifinfo, readproc_success);