Add a level of indirection when naming the DBUS objects

The current design ignores the itemX_label sysfs attribute, if the
environment variable is populated with the MODE_itemX="label", then
fetch the label from itemX_label file.The actual label for the dbus
object is fetched from the environment variable LABEL_item<label>.

Resolves openbmc/openbmc#1633

Change-Id: I0d4baaa91073dd5db75ac62277d78ad9b3065e64
Signed-off-by: Tom Joseph <tomjoseph@in.ibm.com>
diff --git a/mainloop.cpp b/mainloop.cpp
index 1da6b69..5976307 100644
--- a/mainloop.cpp
+++ b/mainloop.cpp
@@ -212,13 +212,34 @@
 
     for (auto& i : *sensors)
     {
-        // Get sensor configuration from the environment.
+        std::string label;
 
-        // Ignore inputs without a label.
-        auto label = getEnv("LABEL", i.first);
-        if (label.empty())
+        /*
+         * Check if the value of the MODE_<item><X> env variable for the sensor
+         * is "label", then read the sensor number from the <item><X>_label
+         * file. The name of the DBUS object would be the value of the env
+         * variable LABEL_<item><sensorNum>. If the MODE_<item><X> env variable
+         * does'nt exist, then the name of DBUS object is the value of the env
+         * variable LABEL_<item><X>.
+         */
+        auto mode = getEnv("MODE", i.first);
+        if (!mode.compare(hwmon::entry::label))
         {
-            continue;
+            label = getIndirectLabelEnv(
+                "LABEL", _hwmonRoot + '/' + _instance + '/', i.first);
+            if (label.empty())
+            {
+                continue;
+            }
+        }
+        else
+        {
+            // Ignore inputs without a label.
+            label = getEnv("LABEL", i.first);
+            if (label.empty())
+            {
+                continue;
+            }
         }
 
         Attributes attrs;