}
*ifacelist[0] = '\0';
- if (getiflist(&ifl, showspeed) > 0) {
+ if (getiflist(&ifl, showspeed, 1) > 0) {
ifl_iterator = ifl;
return 0;
}
-int getiflist(iflist **ifl, const int getspeed)
+int getiflist(iflist **ifl, const int getspeed, const int validate)
{
#if defined(__linux__) || defined(CHECK_VNSTAT)
- return getiflist_linux(ifl, getspeed);
+ return getiflist_linux(ifl, getspeed, validate);
#elif defined(BSD_VNSTAT)
- return getiflist_bsd(ifl, getspeed);
+ return getiflist_bsd(ifl, getspeed, validate);
#endif
}
#if defined(__linux__) || defined(CHECK_VNSTAT)
-int getiflist_linux(iflist **ifl, const int getspeed)
+int getiflist_linux(iflist **ifl, const int getspeed, const int validate)
{
char temp[64];
char interface[32];
sscanf(procline, "%63s", temp);
if (strlen(temp) > 0 && (isdigit(temp[(strlen(temp) - 1)]) || temp[(strlen(temp) - 1)] == ':')) {
sscanf(temp, "%31[^':']s", interface);
+ if (validate && !isifvalid(interface)) {
+ continue;
+ }
if (getspeed) {
iflistadd(ifl, interface, getifspeed(interface));
} else {
if (di->d_name[0] == '.' || strlen(di->d_name) > 31) {
continue;
}
+ if (validate && !isifvalid(di->d_name)) {
+ continue;
+ }
if (getspeed) {
iflistadd(ifl, di->d_name, getifspeed(di->d_name));
} else {
return 0;
}
#elif defined(BSD_VNSTAT)
-int getiflist_bsd(iflist **ifl, const int getspeed)
+int getiflist_bsd(iflist **ifl, const int getspeed, const int validate)
{
struct ifaddrs *ifap, *ifa;
if (ifa->ifa_addr->sa_family != AF_LINK || strlen(ifa->ifa_name) > 31) {
continue;
}
+ if (validate && !isifvalid(ifa->ifa_name)) {
+ continue;
+ }
if (getspeed) {
iflistadd(ifl, ifa->ifa_name, getifspeed(ifa->ifa_name));
} else {
return ret;
}
+
+int isifvalid(const char *iface)
+{
+ if (strstr(iface, ":") != NULL) {
+ return 0;
+ } else if (strcmp(iface, "lo") == 0) {
+ return 0;
+ } else if (strcmp(iface, "lo0") == 0) {
+ return 0;
+ } else if (strcmp(iface, "sit0") == 0) {
+ return 0;
+ }
+ return 1;
+}
fake_proc_net_dev("w", "ethunusual", 0, 0, 0, 0);
ck_assert_int_eq(getifliststring(&ifacelist, 1), 1);
- ck_assert_str_eq(ifacelist, "lo ethunusual ");
+ ck_assert_str_eq(ifacelist, "ethunusual ");
free(ifacelist);
}
fake_sys_class_net("ethunusual", 0, 0, 0, 0, 10);
ck_assert_int_eq(getifliststring(&ifacelist, 1), 1);
- ck_assert_str_eq(ifacelist, "lo ethunusual (10 Mbit) ");
+ ck_assert_str_eq(ifacelist, "ethunusual (10 Mbit) ");
free(ifacelist);
}
fake_proc_net_dev("a", "i", 0, 0, 0, 0);
ck_assert_int_eq(getifliststring(&ifacelist, 0), 1);
- ck_assert_str_eq(ifacelist, "lo random interfaces having fun i ");
+ ck_assert_str_eq(ifacelist, "random interfaces having fun i ");
+
+ free(ifacelist);
+}
+END_TEST
+
+START_TEST(getifliststring_proc_multiple_interfaces_validating)
+{
+ char *ifacelist;
+
+ linuxonly;
+
+ ck_assert_int_eq(remove_directory(TESTDIR), 1);
+ fake_proc_net_dev("w", "random", 0, 0, 0, 0);
+ fake_proc_net_dev("a", "interfaces", 0, 0, 0, 0);
+ fake_proc_net_dev("a", "having", 0, 0, 0, 0);
+ fake_proc_net_dev("a", "sit0", 0, 0, 0, 0);
+ fake_proc_net_dev("a", "fun", 0, 0, 0, 0);
+ fake_proc_net_dev("a", "lo0", 0, 0, 0, 0);
+ fake_proc_net_dev("a", "eth0:0", 0, 0, 0, 0);
+ fake_proc_net_dev("a", "i", 0, 0, 0, 0);
+
+ ck_assert_int_eq(getifliststring(&ifacelist, 0), 1);
+ ck_assert_str_eq(ifacelist, "random interfaces having fun eth0 i ");
free(ifacelist);
}
fake_proc_net_dev("a", "a", 0, 0, 0, 0);
ck_assert_int_eq(getifliststring(&ifacelist, 0), 1);
- ck_assert_str_eq(ifacelist, "lo random interfaces having toomuchfun longinterfaceislong a ");
+ ck_assert_str_eq(ifacelist, "random interfaces having toomuchfun longinterfaceislong a ");
free(ifacelist);
}
}
END_TEST
+START_TEST(getifliststring_sysclassnet_multiple_interfaces_validating)
+{
+ char *ifacelist;
+
+ linuxonly;
+
+ ck_assert_int_eq(remove_directory(TESTDIR), 1);
+ fake_sys_class_net("lo", 0, 0, 0, 0, 0);
+ fake_sys_class_net("random", 0, 0, 0, 0, 0);
+ fake_sys_class_net("lo0", 0, 0, 0, 0, 0);
+ fake_sys_class_net("interfaces", 0, 0, 0, 0, 0);
+ fake_sys_class_net("having", 0, 0, 0, 0, 0);
+ fake_sys_class_net("fun", 0, 0, 0, 0, 0);
+ fake_sys_class_net("sit0", 0, 0, 0, 0, 0);
+ fake_sys_class_net("eth0:0", 0, 0, 0, 0, 0);
+ fake_sys_class_net("i", 0, 0, 0, 0, 0);
+
+ ck_assert_int_eq(getifliststring(&ifacelist, 0), 1);
+ ck_assert_int_eq(strlen(ifacelist), 31);
+
+ free(ifacelist);
+}
+END_TEST
+
START_TEST(getifliststring_sysclassnet_long_interface_names)
{
char *ifacelist;
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_multiple_interfaces_validating);
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_multiple_interfaces_validating);
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);