dbus-sensors: utils: Utility to get device bus & addr from dev name.

This is applicable to all the services which rely on "bus-addr" fmt.
1. FanSensor
2. HwmonTempSensor
3. IntelCPUSensor
4. PSUSensor

In addition this would also fix Fansensor Daemon crashes due to
stoi() exceptions weren't caught earlier.

For example: In a FanSensor Daemon -
Device of f0103000.pwm-fan-controller would be classified as i2cfan
based on new way of defining fan type.
Hence when we parse string for bus-addr, bus=f0103000.pwm and
addr=fan-controller for which stoi() would crash.
This would be true for all non I2c devices defaulting to I2cFan type.

Solution is to use 'std::from_chars' which handles under/overflow
properly. Centralizing this now in Utils would also allow us to manage
this appropriatelty across various services.

Tested:
Tested sanity of all daemons in the system and they work as expected.

Change-Id: I546e967abae7c0fb9fca645867e3037046037647
Signed-off-by: Akshit Shah <shahakshit@google.com>
diff --git a/src/FanMain.cpp b/src/FanMain.cpp
index 9c8a738..7cfb533 100644
--- a/src/FanMain.cpp
+++ b/src/FanMain.cpp
@@ -332,20 +332,15 @@
                 }
                 if (fanType == FanTypes::i2c)
                 {
-                    size_t bus = 0;
-                    size_t address = 0;
-
-                    std::string link =
+                    std::string deviceName =
                         fs::read_symlink(directory / "device").filename();
 
-                    size_t findDash = link.find('-');
-                    if (findDash == std::string::npos ||
-                        link.size() <= findDash + 1)
+                    size_t bus = 0;
+                    size_t addr = 0;
+                    if (!getDeviceBusAddr(deviceName, bus, addr))
                     {
-                        std::cerr << "Error finding device from symlink";
+                        continue;
                     }
-                    bus = std::stoi(link.substr(0, findDash));
-                    address = std::stoi(link.substr(findDash + 1), nullptr, 16);
 
                     auto findBus = baseConfiguration->second.find("Bus");
                     auto findAddress =
@@ -362,7 +357,7 @@
                     unsigned int configAddress = std::visit(
                         VariantToUnsignedIntVisitor(), findAddress->second);
 
-                    if (configBus == bus && configAddress == address)
+                    if (configBus == bus && configAddress == addr)
                     {
                         sensorData = &cfgData;
                         break;