diff --git a/analyzer.cpp b/analyzer.cpp
index f31868c..b26a53a 100644
--- a/analyzer.cpp
+++ b/analyzer.cpp
@@ -13,6 +13,7 @@
 // limitations under the License.
 
 #include "analyzer.hpp"
+
 #include "histogram.hpp"
 #include "main.hpp"
 #include "sensorhelper.hpp"
@@ -20,6 +21,7 @@
 #include "xmlparse.hpp"
 
 #include <unistd.h>
+
 #include <atomic>
 #include <filesystem>
 #include <fstream>
@@ -78,405 +80,405 @@
 
 namespace dbus_top_analyzer
 {
-    DBusTopStatistics g_dbus_statistics;
-    Histogram<float> g_mc_time_histogram;
-    std::unordered_map<uint32_t, uint64_t> in_flight_methodcalls;
-    std::atomic<bool> g_program_done = false;
-    std::chrono::time_point<std::chrono::steady_clock> g_last_update;
-    DBusTopStatisticsCallback g_callback;
-    void SetDBusTopStatisticsCallback(DBusTopStatisticsCallback cb)
-    {
-        g_callback = cb;
-    }
+DBusTopStatistics g_dbus_statistics;
+Histogram<float> g_mc_time_histogram;
+std::unordered_map<uint32_t, uint64_t> in_flight_methodcalls;
+std::atomic<bool> g_program_done = false;
+std::chrono::time_point<std::chrono::steady_clock> g_last_update;
+DBusTopStatisticsCallback g_callback;
+void SetDBusTopStatisticsCallback(DBusTopStatisticsCallback cb)
+{
+    g_callback = cb;
+}
 
-    int UserInputThread()
-    {
-        return 0;
-    }
+int UserInputThread()
+{
+    return 0;
+}
 
-    std::string g_dbus_top_conn = " ";
-    void SetDBusTopConnectionForMonitoring(const std::string& conn)
-    {
-        g_dbus_top_conn = conn;
-    }
+std::string g_dbus_top_conn = " ";
+void SetDBusTopConnectionForMonitoring(const std::string& conn)
+{
+    g_dbus_top_conn = conn;
+}
 
-    // Performs one step of analysis
-    void Process()
+// Performs one step of analysis
+void Process()
+{
+    std::chrono::time_point<std::chrono::steady_clock> t =
+        std::chrono::steady_clock::now();
+    std::chrono::time_point<std::chrono::steady_clock> next_update =
+        g_last_update + std::chrono::milliseconds(g_update_interval_millises);
+    if (t >= next_update)
     {
-        std::chrono::time_point<std::chrono::steady_clock> t =
-            std::chrono::steady_clock::now();
-        std::chrono::time_point<std::chrono::steady_clock> next_update =
-            g_last_update + std::chrono::milliseconds(g_update_interval_millises);
-        if (t >= next_update)
+        float seconds_since_last_sample =
+            std::chrono::duration_cast<std::chrono::microseconds>(t -
+                                                                  g_last_update)
+                .count() /
+            1000000.0f;
+        g_dbus_statistics.seconds_since_last_sample_ =
+            seconds_since_last_sample;
+        // Update snapshot
+        if (g_callback)
         {
-            float seconds_since_last_sample =
-                std::chrono::duration_cast<std::chrono::microseconds>(t -
-                                                                    g_last_update)
-                    .count() /
-                1000000.0f;
-            g_dbus_statistics.seconds_since_last_sample_ =
-                seconds_since_last_sample;
-            // Update snapshot
-            if (g_callback)
-            {
-                g_callback(&g_dbus_statistics, &g_mc_time_histogram);
-            }
-            g_dbus_statistics.Reset();
-            g_last_update = t;
+            g_callback(&g_dbus_statistics, &g_mc_time_histogram);
         }
+        g_dbus_statistics.Reset();
+        g_last_update = t;
     }
+}
 
-    void Finish()
-    {
-        g_program_done = true;
-    }
+void Finish()
+{
+    g_program_done = true;
+}
 
-    std::vector<std::string> FindAllObjectPathsForService(
-        const std::string& service,
-        std::function<void(const std::string&, const std::vector<std::string>&)>
-            on_interface_cb)
+std::vector<std::string> FindAllObjectPathsForService(
+    const std::string& service,
+    std::function<void(const std::string&, const std::vector<std::string>&)>
+        on_interface_cb)
+{
+    sd_bus_error err = SD_BUS_ERROR_NULL;
+    sd_bus_message *m, *reply;
+    std::vector<std::string> paths; // Current iteration
+    std::vector<std::string>
+        all_obj_paths; // All object paths under the supervision of ObjectMapper
+    paths.push_back("/");
+    // busctl call xyz.openbmc_project.ObjectMapper        /
+    // org.freedesktop.DBus.Introspectable        Introspect
+    while (!paths.empty())
     {
-        sd_bus_error err = SD_BUS_ERROR_NULL;
-        sd_bus_message *m, *reply;
-        std::vector<std::string> paths; // Current iteration
-        std::vector<std::string>
-            all_obj_paths; // All object paths under the supervision of ObjectMapper
-        paths.push_back("/");
-        // busctl call xyz.openbmc_project.ObjectMapper        /
-        // org.freedesktop.DBus.Introspectable        Introspect
-        while (!paths.empty())
+        // printf("%d paths to explore, total %d paths so far\n",
+        // int(paths.size()), int(all_obj_paths.size()));
+        std::vector<std::string> new_paths;
+        for (const std::string& obj_path : paths)
         {
-            // printf("%d paths to explore, total %d paths so far\n",
-            // int(paths.size()), int(all_obj_paths.size()));
-            std::vector<std::string> new_paths;
-            for (const std::string& obj_path : paths)
-            {
-                all_obj_paths.push_back(obj_path);
-                int r = sd_bus_message_new_method_call(
-                    g_bus, &m, service.c_str(), obj_path.c_str(),
-                    "org.freedesktop.DBus.Introspectable", "Introspect");
-                if (r < 0)
-                {
-                    printf("Oh! Cannot create new method call. r=%d, strerror=%s\n",
-                        r, strerror(-r));
-                    continue;
-                }
-                r = sd_bus_call(g_bus, m, 0, &err, &reply);
-                if (r < 0)
-                {
-                    printf("Could not execute method call, r=%d, strerror=%s\n", r,
-                        strerror(-r));
-                }
-                const char* sig = sd_bus_message_get_signature(reply, 0);
-                if (!strcmp(sig, "s"))
-                {
-                    const char* s;
-                    int r = sd_bus_message_read(reply, "s", &s);
-                    std::string s1(s);
-                    if (r < 0)
-                    {
-                        printf("Could not read string payload, r=%d, strerror=%s\n",
-                            r, strerror(-r));
-                    }
-                    else
-                    {
-                        XMLNode* t = ParseXML(s1);
-                        std::vector<std::string> ch = t->GetChildNodeNames();
-                        if (on_interface_cb != nullptr)
-                        {
-                            on_interface_cb(obj_path, t->GetInterfaceNames());
-                        }
-                        DeleteTree(t);
-                        for (const std::string& cn : ch)
-                        {
-                            std::string ch_path = obj_path;
-                            if (obj_path.back() == '/')
-                            {}
-                            else
-                                ch_path.push_back('/');
-                            ch_path += cn;
-                            new_paths.push_back(ch_path);
-                        }
-                    }
-                }
-            }
-            paths = new_paths;
-        }
-        return all_obj_paths;
-    }
-
-    void ListAllSensors()
-    {
-        g_connection_snapshot = new DBusConnectionSnapshot();
-        printf("1. Getting names\n");
-        char** names;
-        int r = sd_bus_list_names(g_bus, &names, nullptr);
-        std::vector<std::string> services;
-        std::vector<int> pids;
-        std::vector<std::string> comms;
-        for (char** ptr = names; ptr && *ptr; ++ptr)
-        {
-            services.push_back(*ptr);
-            free(*ptr);
-        }
-        free(names);
-        printf("2. Getting creds of each name\n");
-        for (int i = 0; i < static_cast<int>(services.size()); i++)
-        {
-            const std::string& service = services[i];
-            sd_bus_creds* creds = nullptr;
-            r = sd_bus_get_name_creds(g_bus, services[i].c_str(),
-                                    SD_BUS_CREDS_AUGMENT | SD_BUS_CREDS_EUID |
-                                        SD_BUS_CREDS_PID | SD_BUS_CREDS_COMM |
-                                        SD_BUS_CREDS_UNIQUE_NAME |
-                                        SD_BUS_CREDS_UNIT | SD_BUS_CREDS_SESSION |
-                                        SD_BUS_CREDS_DESCRIPTION,
-                                    &creds);
-            // PID
-            int pid = INVALID;
+            all_obj_paths.push_back(obj_path);
+            int r = sd_bus_message_new_method_call(
+                g_bus, &m, service.c_str(), obj_path.c_str(),
+                "org.freedesktop.DBus.Introspectable", "Introspect");
             if (r < 0)
             {
-                printf("Oh! Cannot get creds for %s\n", services[i].c_str());
+                printf("Oh! Cannot create new method call. r=%d, strerror=%s\n",
+                       r, strerror(-r));
+                continue;
             }
-            else
+            r = sd_bus_call(g_bus, m, 0, &err, &reply);
+            if (r < 0)
             {
-                r = sd_bus_creds_get_pid(creds, &pid);
+                printf("Could not execute method call, r=%d, strerror=%s\n", r,
+                       strerror(-r));
             }
-            pids.push_back(pid);
-            // comm
-            std::string comm;
-            if (pid != INVALID)
+            const char* sig = sd_bus_message_get_signature(reply, 0);
+            if (!strcmp(sig, "s"))
             {
-                std::ifstream ifs("/proc/" + std::to_string(pid) + "/cmdline");
-                std::string line;
-                std::getline(ifs, line);
-                for (char c : line)
-                {
-                    if (c < 32 || c >= 127)
-                        c = ' ';
-                    comm.push_back(c);
-                }
-            }
-            comms.push_back(comm);
-            // unique name, also known as "Connection"
-            std::string connection;
-            const char* u;
-            r = sd_bus_creds_get_unique_name(creds, &u);
-            if (r >= 0)
-            {
-                connection = u;
-            }
-            else
-            {
-                printf("Oh! Could not get unique name for %s\n", service.c_str());
-            }
-            std::string unit;
-            r = sd_bus_creds_get_unit(creds, &u);
-            if (r >= 0)
-            {
-                unit = u;
-            }
-            else
-            {
-                printf("Oh! Could not get unit name for %s\n", unit.c_str());
-            }
-            printf("AddConnection    %s    %s    %s    %s    %d\n", service.c_str(),
-                connection.c_str(), comm.c_str(), unit.c_str(), pid);
-            g_connection_snapshot->AddConnection(service, connection, comm, unit,
-                                                pid);
-        }
-        printf("There are %d DBus names.\n", int(services.size()));
-        for (int i = 0; i < int(services.size()); i++)
-        {
-            printf("    %d: %s [%s]\n", i, services[i].c_str(), comms[i].c_str());
-        }
-        g_sensor_snapshot = new SensorSnapshot(g_connection_snapshot);
-        // busctl call xyz.openbmc_project.ObjectMapper /
-        // org.freedesktop.DBus.Introspectable Introspect
-        printf("3. See which sensors are visible from Object Mapper\n");
-        printf("3.1. Introspect Object Mapper for object paths\n");
-        std::vector<std::string> all_obj_paths = FindAllObjectPathsForService(
-            "xyz.openbmc_project.ObjectMapper", nullptr);
-        sd_bus_error err = SD_BUS_ERROR_NULL;
-        sd_bus_message *m, *reply;
-        printf("%d paths found while introspecting ObjectMapper.\n",
-            int(all_obj_paths.size()));
-        printf("3.2. Call ObjectMapper's GetObject method against the sensor "
-            "object paths that represent sensors\n");
-        for (const std::string& p : all_obj_paths)
-        {
-            if (IsSensorObjectPath(p))
-            {
-                err = SD_BUS_ERROR_NULL;
-                r = sd_bus_message_new_method_call(
-                    g_bus, &m, "xyz.openbmc_project.ObjectMapper",
-                    "/xyz/openbmc_project/object_mapper",
-                    "xyz.openbmc_project.ObjectMapper", "GetObject");
+                const char* s;
+                int r = sd_bus_message_read(reply, "s", &s);
+                std::string s1(s);
                 if (r < 0)
                 {
-                    printf("Cannot create new method call. r=%d, strerror=%s\n", r,
-                        strerror(-r));
-                    continue;
+                    printf("Could not read string payload, r=%d, strerror=%s\n",
+                           r, strerror(-r));
                 }
-                r = sd_bus_message_append_basic(m, 's', p.c_str());
-                if (r < 0)
+                else
                 {
-                    printf("Could not append a string parameter to m\n");
-                    continue;
-                }
-                // empty array
-                r = sd_bus_message_open_container(m, 'a', "s");
-                if (r < 0)
-                {
-                    printf("Could not open a container for m\n");
-                    continue;
-                }
-                r = sd_bus_message_close_container(m);
-                if (r < 0)
-                {
-                    printf("Could not close container for m\n");
-                    continue;
-                }
-                r = sd_bus_call(g_bus, m, 0, &err, &reply);
-                if (r < 0)
-                {
-                    printf("Error performing dbus method call\n");
-                }
-                const char* sig = sd_bus_message_get_signature(reply, 0);
-                if (!strcmp(sig, "a{sas}"))
-                {
-                    r = sd_bus_message_enter_container(reply, 'a', "{sas}");
-                    if (r < 0)
+                    XMLNode* t = ParseXML(s1);
+                    std::vector<std::string> ch = t->GetChildNodeNames();
+                    if (on_interface_cb != nullptr)
                     {
-                        printf("Could not enter the level 0 array container\n");
-                        continue;
+                        on_interface_cb(obj_path, t->GetInterfaceNames());
                     }
-                    while (true)
+                    DeleteTree(t);
+                    for (const std::string& cn : ch)
                     {
-                        r = sd_bus_message_enter_container(
-                            reply, SD_BUS_TYPE_DICT_ENTRY, "sas");
-                        if (r < 0)
-                        {
-                            // printf("Could not enter the level 1 dict
-                            // container\n");
-                            goto DONE;
-                        }
-                        else if (r == 0)
+                        std::string ch_path = obj_path;
+                        if (obj_path.back() == '/')
                         {}
                         else
+                            ch_path.push_back('/');
+                        ch_path += cn;
+                        new_paths.push_back(ch_path);
+                    }
+                }
+            }
+        }
+        paths = new_paths;
+    }
+    return all_obj_paths;
+}
+
+void ListAllSensors()
+{
+    g_connection_snapshot = new DBusConnectionSnapshot();
+    printf("1. Getting names\n");
+    char** names;
+    int r = sd_bus_list_names(g_bus, &names, nullptr);
+    std::vector<std::string> services;
+    std::vector<int> pids;
+    std::vector<std::string> comms;
+    for (char** ptr = names; ptr && *ptr; ++ptr)
+    {
+        services.push_back(*ptr);
+        free(*ptr);
+    }
+    free(names);
+    printf("2. Getting creds of each name\n");
+    for (int i = 0; i < static_cast<int>(services.size()); i++)
+    {
+        const std::string& service = services[i];
+        sd_bus_creds* creds = nullptr;
+        r = sd_bus_get_name_creds(g_bus, services[i].c_str(),
+                                  SD_BUS_CREDS_AUGMENT | SD_BUS_CREDS_EUID |
+                                      SD_BUS_CREDS_PID | SD_BUS_CREDS_COMM |
+                                      SD_BUS_CREDS_UNIQUE_NAME |
+                                      SD_BUS_CREDS_UNIT | SD_BUS_CREDS_SESSION |
+                                      SD_BUS_CREDS_DESCRIPTION,
+                                  &creds);
+        // PID
+        int pid = INVALID;
+        if (r < 0)
+        {
+            printf("Oh! Cannot get creds for %s\n", services[i].c_str());
+        }
+        else
+        {
+            r = sd_bus_creds_get_pid(creds, &pid);
+        }
+        pids.push_back(pid);
+        // comm
+        std::string comm;
+        if (pid != INVALID)
+        {
+            std::ifstream ifs("/proc/" + std::to_string(pid) + "/cmdline");
+            std::string line;
+            std::getline(ifs, line);
+            for (char c : line)
+            {
+                if (c < 32 || c >= 127)
+                    c = ' ';
+                comm.push_back(c);
+            }
+        }
+        comms.push_back(comm);
+        // unique name, also known as "Connection"
+        std::string connection;
+        const char* u;
+        r = sd_bus_creds_get_unique_name(creds, &u);
+        if (r >= 0)
+        {
+            connection = u;
+        }
+        else
+        {
+            printf("Oh! Could not get unique name for %s\n", service.c_str());
+        }
+        std::string unit;
+        r = sd_bus_creds_get_unit(creds, &u);
+        if (r >= 0)
+        {
+            unit = u;
+        }
+        else
+        {
+            printf("Oh! Could not get unit name for %s\n", unit.c_str());
+        }
+        printf("AddConnection    %s    %s    %s    %s    %d\n", service.c_str(),
+               connection.c_str(), comm.c_str(), unit.c_str(), pid);
+        g_connection_snapshot->AddConnection(service, connection, comm, unit,
+                                             pid);
+    }
+    printf("There are %d DBus names.\n", int(services.size()));
+    for (int i = 0; i < int(services.size()); i++)
+    {
+        printf("    %d: %s [%s]\n", i, services[i].c_str(), comms[i].c_str());
+    }
+    g_sensor_snapshot = new SensorSnapshot(g_connection_snapshot);
+    // busctl call xyz.openbmc_project.ObjectMapper /
+    // org.freedesktop.DBus.Introspectable Introspect
+    printf("3. See which sensors are visible from Object Mapper\n");
+    printf("3.1. Introspect Object Mapper for object paths\n");
+    std::vector<std::string> all_obj_paths = FindAllObjectPathsForService(
+        "xyz.openbmc_project.ObjectMapper", nullptr);
+    sd_bus_error err = SD_BUS_ERROR_NULL;
+    sd_bus_message *m, *reply;
+    printf("%d paths found while introspecting ObjectMapper.\n",
+           int(all_obj_paths.size()));
+    printf("3.2. Call ObjectMapper's GetObject method against the sensor "
+           "object paths that represent sensors\n");
+    for (const std::string& p : all_obj_paths)
+    {
+        if (IsSensorObjectPath(p))
+        {
+            err = SD_BUS_ERROR_NULL;
+            r = sd_bus_message_new_method_call(
+                g_bus, &m, "xyz.openbmc_project.ObjectMapper",
+                "/xyz/openbmc_project/object_mapper",
+                "xyz.openbmc_project.ObjectMapper", "GetObject");
+            if (r < 0)
+            {
+                printf("Cannot create new method call. r=%d, strerror=%s\n", r,
+                       strerror(-r));
+                continue;
+            }
+            r = sd_bus_message_append_basic(m, 's', p.c_str());
+            if (r < 0)
+            {
+                printf("Could not append a string parameter to m\n");
+                continue;
+            }
+            // empty array
+            r = sd_bus_message_open_container(m, 'a', "s");
+            if (r < 0)
+            {
+                printf("Could not open a container for m\n");
+                continue;
+            }
+            r = sd_bus_message_close_container(m);
+            if (r < 0)
+            {
+                printf("Could not close container for m\n");
+                continue;
+            }
+            r = sd_bus_call(g_bus, m, 0, &err, &reply);
+            if (r < 0)
+            {
+                printf("Error performing dbus method call\n");
+            }
+            const char* sig = sd_bus_message_get_signature(reply, 0);
+            if (!strcmp(sig, "a{sas}"))
+            {
+                r = sd_bus_message_enter_container(reply, 'a', "{sas}");
+                if (r < 0)
+                {
+                    printf("Could not enter the level 0 array container\n");
+                    continue;
+                }
+                while (true)
+                {
+                    r = sd_bus_message_enter_container(
+                        reply, SD_BUS_TYPE_DICT_ENTRY, "sas");
+                    if (r < 0)
+                    {
+                        // printf("Could not enter the level 1 dict
+                        // container\n");
+                        goto DONE;
+                    }
+                    else if (r == 0)
+                    {}
+                    else
+                    {
+                        // The following 2 correspond to `interface_map` in
+                        // phosphor-mapper
+                        const char* interface_map_first;
+                        r = sd_bus_message_read_basic(reply, 's',
+                                                      &interface_map_first);
+                        if (r < 0)
                         {
-                            // The following 2 correspond to `interface_map` in
-                            // phosphor-mapper
-                            const char* interface_map_first;
-                            r = sd_bus_message_read_basic(reply, 's',
-                                                        &interface_map_first);
+                            printf("Could not read interface_map_first\n");
+                            goto DONE;
+                        }
+                        r = sd_bus_message_enter_container(reply, 'a', "s");
+                        if (r < 0)
+                        {
+                            printf("Could not enter the level 2 array "
+                                   "container\n");
+                            goto DONE;
+                        }
+                        bool has_value_interface = false;
+                        while (true)
+                        {
+                            const char* interface_map_second;
+                            r = sd_bus_message_read_basic(
+                                reply, 's', &interface_map_second);
                             if (r < 0)
                             {
-                                printf("Could not read interface_map_first\n");
-                                goto DONE;
+                                printf("Could not read interface_map_second\n");
                             }
-                            r = sd_bus_message_enter_container(reply, 'a', "s");
-                            if (r < 0)
+                            else if (r == 0)
+                                break;
+                            else
                             {
-                                printf("Could not enter the level 2 array "
-                                    "container\n");
-                                goto DONE;
-                            }
-                            bool has_value_interface = false;
-                            while (true)
-                            {
-                                const char* interface_map_second;
-                                r = sd_bus_message_read_basic(
-                                    reply, 's', &interface_map_second);
-                                if (r < 0)
+                                // printf("    %s\n", interface_map_second);
+                                if (!strcmp(interface_map_second,
+                                            "xyz.openbmc_project.Sensor.Value"))
                                 {
-                                    printf("Could not read interface_map_second\n");
-                                }
-                                else if (r == 0)
-                                    break;
-                                else
-                                {
-                                    // printf("    %s\n", interface_map_second);
-                                    if (!strcmp(interface_map_second,
-                                                "xyz.openbmc_project.Sensor.Value"))
-                                    {
-                                        has_value_interface = true;
-                                    }
+                                    has_value_interface = true;
                                 }
                             }
-                            if (has_value_interface)
-                            {
-                                g_sensor_snapshot->SerSensorVisibleFromObjectMapper(
-                                    std::string(interface_map_first), p);
-                            }
-                            r = sd_bus_message_exit_container(reply);
+                        }
+                        if (has_value_interface)
+                        {
+                            g_sensor_snapshot->SerSensorVisibleFromObjectMapper(
+                                std::string(interface_map_first), p);
                         }
                         r = sd_bus_message_exit_container(reply);
                     }
                     r = sd_bus_message_exit_container(reply);
                 }
-            DONE:
-            {}
+                r = sd_bus_message_exit_container(reply);
             }
+        DONE:
+        {}
         }
-        printf("4. Check Hwmon's DBus objects\n");
-        for (int i = 0; i < int(comms.size()); i++)
+    }
+    printf("4. Check Hwmon's DBus objects\n");
+    for (int i = 0; i < int(comms.size()); i++)
+    {
+        const std::string& comm = comms[i];
+        const std::string& service = services[i];
+        if (comm.find("phosphor-hwmon-readd") != std::string::npos &&
+            !IsUniqueName(service))
         {
-            const std::string& comm = comms[i];
-            const std::string& service = services[i];
-            if (comm.find("phosphor-hwmon-readd") != std::string::npos &&
-                !IsUniqueName(service))
+            // printf("Should introspect %s\n", service.c_str());
+            std::vector<std::string> objpaths =
+                FindAllObjectPathsForService(service, nullptr);
+            for (const std::string& op : objpaths)
             {
-                // printf("Should introspect %s\n", service.c_str());
-                std::vector<std::string> objpaths =
-                    FindAllObjectPathsForService(service, nullptr);
-                for (const std::string& op : objpaths)
+                if (IsSensorObjectPath(op))
                 {
-                    if (IsSensorObjectPath(op))
-                    {
-                        g_sensor_snapshot->SetSensorVisibleFromHwmon(service, op);
-                    }
+                    g_sensor_snapshot->SetSensorVisibleFromHwmon(service, op);
                 }
             }
         }
-        // Call `ipmitool sdr list` and see which sensors exist.
-        printf("5. Checking ipmitool SDR List\n");
-        std::string out;
-        bool skip_sdr_list = false;
-        if (getenv("SKIP"))
-        {
-            skip_sdr_list = true;
-        }
-        if (!skip_sdr_list)
-        {
-            constexpr int MAX_BUFFER = 255;
-            char buffer[MAX_BUFFER];
-            FILE* stream = popen("ipmitool sdr list", "r");
-            while (fgets(buffer, MAX_BUFFER, stream) != NULL)
-            {
-                out.append(buffer);
-            }
-            pclose(stream);
-        }
-        std::stringstream ss(out);
-        while (true)
-        {
-            std::string sensor_id, reading, status;
-            std::getline(ss, sensor_id, '|');
-            std::getline(ss, reading, '|');
-            std::getline(ss, status);
-            // printf("%s %s %s\n", sensor_id.c_str(), reading.c_str(),
-            // status.c_str());
-            if (sensor_id.size() > 0 && reading.size() > 0 && status.size() > 0)
-            {
-                g_sensor_snapshot->SetSensorVisibleFromIpmitoolSdr(Trim(sensor_id));
-            }
-            else
-                break;
-        }
-        printf("=== Sensors snapshot summary: ===\n");
-        g_sensor_snapshot->PrintSummary();
     }
+    // Call `ipmitool sdr list` and see which sensors exist.
+    printf("5. Checking ipmitool SDR List\n");
+    std::string out;
+    bool skip_sdr_list = false;
+    if (getenv("SKIP"))
+    {
+        skip_sdr_list = true;
+    }
+    if (!skip_sdr_list)
+    {
+        constexpr int MAX_BUFFER = 255;
+        char buffer[MAX_BUFFER];
+        FILE* stream = popen("ipmitool sdr list", "r");
+        while (fgets(buffer, MAX_BUFFER, stream) != NULL)
+        {
+            out.append(buffer);
+        }
+        pclose(stream);
+    }
+    std::stringstream ss(out);
+    while (true)
+    {
+        std::string sensor_id, reading, status;
+        std::getline(ss, sensor_id, '|');
+        std::getline(ss, reading, '|');
+        std::getline(ss, status);
+        // printf("%s %s %s\n", sensor_id.c_str(), reading.c_str(),
+        // status.c_str());
+        if (sensor_id.size() > 0 && reading.size() > 0 && status.size() > 0)
+        {
+            g_sensor_snapshot->SetSensorVisibleFromIpmitoolSdr(Trim(sensor_id));
+        }
+        else
+            break;
+    }
+    printf("=== Sensors snapshot summary: ===\n");
+    g_sensor_snapshot->PrintSummary();
+}
 } // namespace dbus_top_analyzer
 
 void DBusTopStatistics::OnNewDBusMessage(const char* sender,
diff --git a/analyzer.hpp b/analyzer.hpp
index 2284c7f..0649dc6 100644
--- a/analyzer.hpp
+++ b/analyzer.hpp
@@ -114,7 +114,7 @@
         num_error_ = 0;
         stats_.clear();
     }
-    
+
     void SetSortFieldsAndReset(const std::vector<DBusTopSortField>& f)
     {
         num_messages_ = 0;
@@ -166,12 +166,12 @@
 // typedef void (*SetDBusTopConnection)(const char* conn);
 namespace dbus_top_analyzer
 {
-    void Process();
-    void Finish();
-    typedef void (*DBusTopStatisticsCallback)(DBusTopStatistics*,
-                                            Histogram<float>*);
-    void SetDBusTopStatisticsCallback(DBusTopStatisticsCallback cb);
-    void AnalyzerThread();
-    // Methods for sending Object Mapper queries
-    void ListAllSensors();
+void Process();
+void Finish();
+typedef void (*DBusTopStatisticsCallback)(DBusTopStatistics*,
+                                          Histogram<float>*);
+void SetDBusTopStatisticsCallback(DBusTopStatisticsCallback cb);
+void AnalyzerThread();
+// Methods for sending Object Mapper queries
+void ListAllSensors();
 } // namespace dbus_top_analyzer
diff --git a/histogram.hpp b/histogram.hpp
index 750a9f4..a031127 100644
--- a/histogram.hpp
+++ b/histogram.hpp
@@ -128,7 +128,7 @@
             return 0;
         return buckets_[idx];
     }
-    
+
     void Assign(Histogram<ValueType>* out)
     {
         out->num_entries_ = num_entries_;
@@ -172,7 +172,7 @@
     {
         return num_entries_ == 0;
     }
-    
+
     int num_entries_;
     std::vector<ValueType> samples_;
     int num_low_outliers_, num_high_outliers_;
diff --git a/menu.hpp b/menu.hpp
index afb4110..a39c2e1 100644
--- a/menu.hpp
+++ b/menu.hpp
@@ -119,4 +119,3 @@
     DBusTopWindow* parent_;
     Order order;
 };
-
diff --git a/sensorhelper.hpp b/sensorhelper.hpp
index a619c4a..4c80ebb 100644
--- a/sensorhelper.hpp
+++ b/sensorhelper.hpp
@@ -105,7 +105,6 @@
         return nullptr;
     }
 
-
     // Only when service is known (during playback)
     void AddConnection(const std::string& _s)
     {
@@ -156,7 +155,6 @@
         }
         return service;
     }
-
 };
 
 // Each sensor might have different units, for example current and voltage
@@ -293,7 +291,7 @@
         Sensor* s = FindOrCreateSensorByServiceAndObject(service, object);
         s->visibility_flags_.set(VISIBILITY_OBJECT_MAPPER);
     }
-    
+
     // This sensor is visible from Hwmon
     void SetSensorVisibleFromHwmon(const std::string& service,
                                    const std::string& object)
diff --git a/views.cpp b/views.cpp
index 5acf160..b8de9ae 100644
--- a/views.cpp
+++ b/views.cpp
@@ -13,10 +13,13 @@
 // limitations under the License.
 
 #include "views.hpp"
+
 #include "bargraph.hpp"
 #include "histogram.hpp"
 #include "menu.hpp"
+
 #include <string.h>
+
 #include <algorithm>
 
 extern SensorSnapshot* g_sensor_snapshot;
@@ -29,7 +32,7 @@
 
 namespace dbus_top_analyzer
 {
-    extern DBusTopStatistics g_dbus_statistics;
+extern DBusTopStatistics g_dbus_statistics;
 }
 
 // Linear interpolation
@@ -412,9 +415,12 @@
                     wattrset(win, A_REVERSE);
                 }
                 std::string s = sensor_ids_[idx];
-                if (static_cast<int>(s.size()) > col_width) {
+                if (static_cast<int>(s.size()) > col_width)
+                {
                     s = s.substr(0, col_width - 2) + "..";
-                } else {
+                }
+                else
+                {
                     while (static_cast<int>(s.size()) < col_width)
                     {
                         s.push_back(' ');
@@ -541,7 +547,7 @@
     }
     for (int i = 0; i < N; i++)
     {
-    const std::string s = FieldNames[i];
+        const std::string s = FieldNames[i];
         if (inactive_fields.count(s) > 0)
         {
             menu1_->AddItem(s);
@@ -551,7 +557,7 @@
             menu2_->AddItem(s);
         }
     }
-    
+
     curr_menu_state_ = LeftSide;
     menu_h_ = 5;
     menu_w_ = 24; // Need at least 2*padding + 15 for enough space, see menu.hpp
@@ -980,14 +986,14 @@
         int idx0 = 0; // indexing into the std::vector<string> of each row
         std::vector<std::string> row;
 
-        StringOrFloat sort_key; // The key used for sorting
+        StringOrFloat sort_key;         // The key used for sorting
         for (int j = 0; j < ncols; j++) // one column in the row
         {
             DBusTopSortField field = fields[j];
             // Populate the content of stats_snapshot_staged
 
             StringOrFloat sof; // Represents this column
-            
+
             // When we haven't used up all
             if (idx0 < static_cast<int>(itr->first.size()))
             {
@@ -1081,7 +1087,7 @@
         stats_snapshot_staged.push_back(std::make_pair(sort_key, row));
         itr++;
     }
-    
+
     // Sort the "staged snapshot" using the sort_key, using different functions
     // depending on whether sort key is numeric or string
     if (is_sort_key_numeric)
@@ -1102,7 +1108,7 @@
                 return a.first.s < b.first.s;
             });
     }
-    
+
     if (sort_order_ == Descending)
     {
         std::reverse(stats_snapshot_staged.begin(),
@@ -1114,9 +1120,9 @@
     const int y0 = 2, y1 = y0 + num_lines_shown - 1;
     // Key is sender, destination, interface, path, etc
     for (int i = 0, shown = 0;
-        i + disp_row_idx_ < static_cast<int>(stats_snapshot_staged.size()) &&
-        shown < num_lines_shown;
-        i++, shown++)
+         i + disp_row_idx_ < static_cast<int>(stats_snapshot_staged.size()) &&
+         shown < num_lines_shown;
+         i++, shown++)
     {
         std::string s;
         int x = 0;
diff --git a/xmlparse.cpp b/xmlparse.cpp
index 2e4b1a3..93cb44d 100644
--- a/xmlparse.cpp
+++ b/xmlparse.cpp
@@ -13,6 +13,7 @@
 // limitations under the License.
 
 #include "xmlparse.hpp"
+
 #include "main.hpp"
 
 int Munch(const std::string& sv, int* idx, std::string* out)
diff --git a/xmlparse.hpp b/xmlparse.hpp
index 3a76e9a..1ed836f 100644
--- a/xmlparse.hpp
+++ b/xmlparse.hpp
@@ -58,7 +58,7 @@
     {
         fields["name"] = n;
     }
-    
+
     std::vector<std::string> GetChildNodeNames();
     std::vector<std::string> GetInterfaceNames();
 };
