summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2021-09-11 09:00:52 +0200
committerMatthias Beyer <mail@beyermatthias.de>2021-09-11 09:01:32 +0200
commit857c56a495d8dfa3b65f0997123f5b517e193ded (patch)
treec7a4b2a3d1af1cd8b1e6915fcf996c4c9dbf0374
parentdf6c67d25a85f9f12923f54e05695ad333a0835b (diff)
Let interface_reader always read all interfaces and filter when fetching the data from it
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
-rw-r--r--src/interface_reader.cpp32
-rw-r--r--src/interface_reader.hpp9
2 files changed, 17 insertions, 24 deletions
diff --git a/src/interface_reader.cpp b/src/interface_reader.cpp
index cb80053..a82683b 100644
--- a/src/interface_reader.cpp
+++ b/src/interface_reader.cpp
@@ -21,7 +21,7 @@
#include <sys/types.h>
#include <unistd.h>
-interface_reader::interface_reader(std::vector<std::string> interfaces) : interface_names(interfaces), interfaces() {
+interface_reader::interface_reader() : interfaces() {
}
std::optional<interface_read_error>
@@ -45,12 +45,6 @@ interface_reader::read_interfaces(void)
std::string interface_name = ifa->ifa_name;
- // If we do not have any interface names to filter for, we use them all.
- // If we have any, we filter
- if (this->do_filter() && !this->interface_whitelisted(interface_name)) {
- continue;
- }
-
std::optional<std::string> address;
int family = ifa->ifa_addr->sa_family;
if (family == AF_INET || family == AF_INET6) {
@@ -76,21 +70,23 @@ interface_reader::read_interfaces(void)
return {};
}
-std::vector<interface> const&
-interface_reader::get_interfaces(void) const
+std::vector<interface>
+interface_reader::get_interface_by_name(std::string const& name) const
{
- return this->interfaces;
-}
+ // TODO: optimize. We don't need to copy objects here, returning a list of
+ // const references is way better
+ std::vector<interface> interfaces;
-bool
-interface_reader::do_filter(void) const
-{
- return !this->interface_names.empty();
+ std::copy_if(this->interfaces.begin(), this->interfaces.end(), std::back_inserter(interfaces),
+ [&](interface const& inf){ return inf.get_name() == name; });
+
+ return interfaces;
}
-bool
-interface_reader::interface_whitelisted(std::string const& if_name) const
+std::vector<interface> const&
+interface_reader::get_interfaces(void) const
{
- return std::find(this->interface_names.begin(), this->interface_names.end(), if_name) != this->interface_names.end();
+ return this->interfaces;
}
+
diff --git a/src/interface_reader.hpp b/src/interface_reader.hpp
index f38a12f..8d3515f 100644
--- a/src/interface_reader.hpp
+++ b/src/interface_reader.hpp
@@ -8,20 +8,17 @@
class interface_reader {
public:
- interface_reader(std::vector<std::string> interfaces);
+ interface_reader();
std::optional<interface_read_error> read_interfaces(void);
std::vector<interface> const& get_interfaces(void) const;
- private:
- std::vector<std::string> interface_names;
+ std::vector<interface> get_interface_by_name(std::string const& name) const;
+ private:
std::vector<interface> interfaces;
- bool do_filter(void) const;
- bool interface_whitelisted(std::string const& if_name) const;
-
};
#endif // GETIF_INTERFACE_READER_H