]> granicus.if.org Git - vnstat/commitdiff
refactor interface list output
authorTeemu Toivola <git@humdi.net>
Tue, 14 May 2019 19:41:54 +0000 (22:41 +0300)
committerTeemu Toivola <git@humdi.net>
Tue, 14 May 2019 19:41:54 +0000 (22:41 +0300)
14 files changed:
Makefile.am
Makefile.in
src/daemon.c
src/dbsql.c
src/dbsql.h
src/ifinfo.c
src/ifinfo.h
src/iflist.c [new file with mode: 0644]
src/iflist.h [new file with mode: 0644]
src/misc.c
src/misc.h
src/vnstat.c
tests/daemon_tests.c
tests/ifinfo_tests.c

index b1c5173912d2a36e335b73b9c529bf48678ebc9f..7431d99eb1b1e96acd5eac37e1c267162786e987 100644 (file)
@@ -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
index 36ecf50325426e9543002790152ae007355fdf7d..fada63cca619fc09a36668ad7cca8c471f5aad1a 100644 (file)
@@ -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
index 36b8367c1a8eca9814a9757bfb2861f8ef40491f..65ee9ba9fa5e84fb33c281afda18b01ef5ff300b 100644 (file)
@@ -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;
index a8bbcd6c362cbdb499bd29f7f5543a5d46d5206d..fcb892311a942603efbafed997b77ded815eef1e 100644 (file)
@@ -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++;
index 778fe5eea3e0b092aa88f1a7e9a141a61821bdcc..03d138872a285e5af9a8cd7abcafda6fdb48d618 100644 (file)
@@ -2,7 +2,7 @@
 #define DBSQL_H
 
 #include <sqlite3.h>
-#include "misc.h"
+#include "iflist.h"
 
 typedef struct dbdatalist {
        time_t timestamp;
index b531661e39c72c8765a5005ad64c9f2ee8097fcf..d1d915f460d70dbaee806ab2973f61975c4d01b6 100644 (file)
@@ -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);
                        }
                }
 
index 3ff989233f443c2ca5b4077ff33368dde18b8016..ff9cd0ab08de24e6a116844cdbfb45102409d68e 100644 (file)
@@ -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 <net/if.h>
 #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 (file)
index 0000000..7bd6c7c
--- /dev/null
@@ -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 (file)
index 0000000..1437bf4
--- /dev/null
@@ -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
index fe480f21efacb60c45a0cbe2a1f4d536477fe12c..aa4fc1d703515ea9fc618cefc15b4256236a76f4 100644 (file)
@@ -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);
-       }
-}
index 5e8500002aa26b932d3fc0408efbe45ec4f156b2..b8e9f96a2aeaaa9f5658bd3947eda413da00e4f6 100644 (file)
@@ -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
index 451c4fa70771a5dd50048b40584f6139b88af185..9e57de65cd3fd4d8376c20cd75855d88ee240d6c 100644 (file)
@@ -17,6 +17,7 @@ vnStat - Copyright (c) 2002-2019 Teemu Toivola <tst@iki.fi>
 
 #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)) {
index 8e06c2b96adf41a061a2eb814f1e1b1f26bb2bf3..6c016038c43bd3ca722dabf3fafafaa8fd58c233 100644 (file)
@@ -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;
 
index ba097817d9dcc4ec465cc66590d8a01113efef40..bd995072214f342cbbe872168f3ed19e1573055e 100644 (file)
@@ -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);