config_parser: Reduce number of file reads

This changes focuses on reducing the number of Parser() constructions to
limit the number of duplicate file reads.

Change-Id: I05df943844c70dc6aa729ab744d2d405cbfe2c76
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/src/util.cpp b/src/util.cpp
index 13be8d0..26d9b47 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -364,21 +364,41 @@
     return "eth" + std::to_string(idx) + "addr";
 }
 
-EthernetInterfaceIntf::DHCPConf getDHCPValue(const std::string& confDir,
-                                             const std::string& intf)
+bool getIPv6AcceptRA(const config::Parser& config)
 {
-    // Get the interface mode value from systemd conf
-    // using namespace std::string_literals;
-    fs::path confPath = confDir;
-    std::string fileName = systemd::config::networkFilePrefix + intf +
-                           systemd::config::networkFileSuffix;
-    confPath /= fileName;
-
-    config::Parser parser(confPath.string());
-    const auto& values = parser.getValues("Network", "DHCP");
+    const auto& values = config.getValues("Network", "IPv6AcceptRA");
     if (values.empty())
     {
-        log<level::NOTICE>("Unable to get the value for Network[DHCP]");
+        auto msg = fmt::format(
+            "Unable to get the value for Network[IPv6AcceptRA] from {}",
+            config.getFilename().native());
+        log<level::NOTICE>(msg.c_str(),
+                           entry("FILE=%s", config.getFilename().c_str()));
+        return false;
+    }
+    auto ret = config::parseBool(values.back());
+    if (!ret.has_value())
+    {
+        auto msg = fmt::format(
+            "Failed to parse section Network[IPv6AcceptRA] from {}: `{}`",
+            config.getFilename().native(), values.back());
+        log<level::NOTICE>(msg.c_str(),
+                           entry("FILE=%s", config.getFilename().c_str()),
+                           entry("VALUE=%s", values.back().c_str()));
+    }
+    return ret.value_or(false);
+}
+
+EthernetInterfaceIntf::DHCPConf getDHCPValue(const config::Parser& config)
+{
+    const auto& values = config.getValues("Network", "DHCP");
+    if (values.empty())
+    {
+        auto msg =
+            fmt::format("Unable to get the value for Network[DHCP] from {}",
+                        config.getFilename().native());
+        log<level::NOTICE>(msg.c_str(),
+                           entry("FILE=%s", config.getFilename().c_str()));
         return EthernetInterfaceIntf::DHCPConf::none;
     }
     if (config::icaseeq(values.back(), "ipv4"))
@@ -392,9 +412,11 @@
     auto ret = config::parseBool(values.back());
     if (!ret.has_value())
     {
-        auto str =
-            fmt::format("Unable to parse Network[DHCP]: `{}`", values.back());
-        log<level::NOTICE>(str.c_str());
+        auto str = fmt::format("Unable to parse Network[DHCP] from {}: `{}`",
+                               config.getFilename().native(), values.back());
+        log<level::NOTICE>(str.c_str(),
+                           entry("FILE=%s", config.getFilename().c_str()),
+                           entry("VALUE=%s", values.back().c_str()));
     }
     return ret.value_or(false) ? EthernetInterfaceIntf::DHCPConf::both
                                : EthernetInterfaceIntf::DHCPConf::none;