diff --git a/functions.cpp b/functions.cpp
index ab97e0a..0ee20ec 100644
--- a/functions.cpp
+++ b/functions.cpp
@@ -348,8 +348,8 @@
 
         // Create symlinks from the hostfw elements to their corresponding
         // lid files if they don't exist
-        auto elementFilePath =
-            std::filesystem::path("/media/hostfw/running") / a.first;
+        auto elementFilePath = std::filesystem::path("/media/hostfw/running") /
+                               a.first;
         if (!std::filesystem::exists(elementFilePath))
         {
             std::error_code ec;
@@ -640,24 +640,24 @@
                 "xyz.openbmc_project.EntityManager"),
         [pExtensionMap, pHostFirmwareDirectory, pErrorCallback,
          &loop](auto& message) {
-            // bind the extension map, host firmware directory, and error
-            // callback to the maybeMakeLinks function.
-            auto maybeMakeLinksWithArgsBound =
-                std::bind(maybeMakeLinks, std::cref(*pExtensionMap),
-                          std::cref(*pHostFirmwareDirectory),
-                          std::placeholders::_1, std::cref(*pErrorCallback));
+        // bind the extension map, host firmware directory, and error
+        // callback to the maybeMakeLinks function.
+        auto maybeMakeLinksWithArgsBound =
+            std::bind(maybeMakeLinks, std::cref(*pExtensionMap),
+                      std::cref(*pHostFirmwareDirectory), std::placeholders::_1,
+                      std::cref(*pErrorCallback));
 
-            // if the InterfacesAdded message contains an an instance of
-            // xyz.openbmc_project.Configuration.IBMCompatibleSystem, check to
-            // see if links are necessary on this system and if so, create
-            // them.
-            if (maybeCallMessage(message, maybeMakeLinksWithArgsBound))
-            {
-                // The IBMCompatibleSystem interface was found and the links
-                // were created if applicable.  Instruct the event loop /
-                // subcommand to exit.
-                loop.exit(0);
-            }
+        // if the InterfacesAdded message contains an an instance of
+        // xyz.openbmc_project.Configuration.IBMCompatibleSystem, check to
+        // see if links are necessary on this system and if so, create
+        // them.
+        if (maybeCallMessage(message, maybeMakeLinksWithArgsBound))
+        {
+            // The IBMCompatibleSystem interface was found and the links
+            // were created if applicable.  Instruct the event loop /
+            // subcommand to exit.
+            loop.exit(0);
+        }
         });
 
     // now that we'll get a callback in the event of an InterfacesAdded signal
@@ -757,10 +757,10 @@
                 "xyz.openbmc_project.EntityManager"),
         [pldmPath, pExtensionMap, pElementsJsonFilePath,
          maybeSetAttrWithArgsBound, &loop](auto& message) {
-            if (maybeCallMessage(message, maybeSetAttrWithArgsBound))
-            {
-                loop.exit(0);
-            }
+        if (maybeCallMessage(message, maybeSetAttrWithArgsBound))
+        {
+            loop.exit(0);
+        }
         }));
 
     // The BIOS attribute table can only be updated if PLDM is running because
@@ -773,29 +773,28 @@
                 "xyz.openbmc_project.PLDM"),
         [pExtensionMap, pElementsJsonFilePath, maybeSetAttrWithArgsBound,
          &loop](auto& message) {
-            std::string name;
-            std::string oldOwner;
-            std::string newOwner;
-            message.read(name, oldOwner, newOwner);
+        std::string name;
+        std::string oldOwner;
+        std::string newOwner;
+        message.read(name, oldOwner, newOwner);
 
-            if (newOwner.empty())
-            {
-                return;
-            }
+        if (newOwner.empty())
+        {
+            return;
+        }
 
-            auto bus = sdbusplus::bus::new_default();
-            InterfacesPropertiesMap interfacesAndProperties;
-            auto objects = getManagedObjects(bus, entityManagerServiceName,
-                                             "/xyz/openbmc_project/inventory");
-            for (const auto& pair : objects)
+        auto bus = sdbusplus::bus::new_default();
+        InterfacesPropertiesMap interfacesAndProperties;
+        auto objects = getManagedObjects(bus, entityManagerServiceName,
+                                         "/xyz/openbmc_project/inventory");
+        for (const auto& pair : objects)
+        {
+            std::tie(std::ignore, interfacesAndProperties) = pair;
+            if (maybeCall(interfacesAndProperties, maybeSetAttrWithArgsBound))
             {
-                std::tie(std::ignore, interfacesAndProperties) = pair;
-                if (maybeCall(interfacesAndProperties,
-                              maybeSetAttrWithArgsBound))
-                {
-                    loop.exit(0);
-                }
+                loop.exit(0);
             }
+        }
         }));
 
     InterfacesPropertiesMap interfacesAndProperties;
