diff --git a/inc/srvcfg_manager.hpp b/inc/srvcfg_manager.hpp
index ea84c53..d0a3ae1 100644
--- a/inc/srvcfg_manager.hpp
+++ b/inc/srvcfg_manager.hpp
@@ -1,113 +1,113 @@
-/*
-// Copyright (c) 2018 Intel Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-*/
-#pragma once
-#include "utils.hpp"
-
-#include <sdbusplus/timer.hpp>
-
-namespace phosphor
-{
-namespace service
-{
-
-static constexpr const char* serviceConfigSrvName =
-    "xyz.openbmc_project.Control.Service.Manager";
-static constexpr const char* serviceConfigIntfName =
-    "xyz.openbmc_project.Control.Service.Attributes";
-static constexpr const char* sockAttrIntfName =
-    "xyz.openbmc_project.Control.Service.SocketAttributes";
-static constexpr const char* srcCfgMgrBasePath =
-    "/xyz/openbmc_project/control/service";
-static constexpr const char* srcCfgMgrIntf =
-    "/xyz/openbmc_project.Control.Service.Manager";
-static constexpr const char* sockAttrPropPort = "Port";
-static constexpr const char* srvCfgPropMasked = "Masked";
-static constexpr const char* srvCfgPropEnabled = "Enabled";
-static constexpr const char* srvCfgPropRunning = "Running";
-
-enum class UpdatedProp
-{
-    port = 1,
-    maskedState,
-    enabledState,
-    runningState
-};
-
-using VariantType =
-    std::variant<std::string, int64_t, uint64_t, double, int32_t, uint32_t,
-                 int16_t, uint16_t, uint8_t, bool,
-                 std::vector<std::tuple<std::string, std::string>>>;
-
-class ServiceConfig
-{
-  public:
-    ServiceConfig(sdbusplus::asio::object_server& srv_,
-                  std::shared_ptr<sdbusplus::asio::connection>& conn_,
-                  const std::string& objPath_, const std::string& baseUnitName,
-                  const std::string& instanceName,
-                  const std::string& serviceObjPath,
-                  const std::string& socketObjPath);
-    ~ServiceConfig() = default;
-
-    std::shared_ptr<sdbusplus::asio::connection> conn;
-    uint8_t updatedFlag;
-
-    void stopAndApplyUnitConfig(boost::asio::yield_context yield);
-    void restartUnitConfig(boost::asio::yield_context yield);
-    void startServiceRestartTimer();
-
-  private:
-    sdbusplus::asio::object_server& server;
-    std::shared_ptr<sdbusplus::asio::dbus_interface> srvCfgIface;
-    std::shared_ptr<sdbusplus::asio::dbus_interface> sockAttrIface;
-
-    bool internalSet = false;
-    std::string objPath;
-    std::string baseUnitName;
-    std::string instanceName;
-    std::string instantiatedUnitName;
-    std::string serviceObjectPath;
-    std::string socketObjectPath;
-    std::string overrideConfDir;
-
-    // Properties
-    std::string activeState;
-    std::string subState;
-    uint16_t portNum;
-    std::vector<std::string> channelList;
-    std::string protocol;
-    std::string stateValue;
-    bool unitMaskedState = false;
-    bool unitEnabledState = false;
-    bool unitRunningState = false;
-    std::string subStateValue;
-
-    bool isMaskedOut();
-    void registerProperties();
-    void queryAndUpdateProperties();
-    void createSocketOverrideConf();
-    void updateServiceProperties(
-        const boost::container::flat_map<std::string, VariantType>&
-            propertyMap);
-    void updateSocketProperties(
-        const boost::container::flat_map<std::string, VariantType>&
-            propertyMap);
-    std::string getSocketUnitName();
-    std::string getServiceUnitName();
-};
-
-} // namespace service
-} // namespace phosphor
+/*
+// Copyright (c) 2018 Intel Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+*/
+#pragma once
+#include "utils.hpp"
+
+#include <sdbusplus/timer.hpp>
+
+namespace phosphor
+{
+namespace service
+{
+
+static constexpr const char* serviceConfigSrvName =
+    "xyz.openbmc_project.Control.Service.Manager";
+static constexpr const char* serviceConfigIntfName =
+    "xyz.openbmc_project.Control.Service.Attributes";
+static constexpr const char* sockAttrIntfName =
+    "xyz.openbmc_project.Control.Service.SocketAttributes";
+static constexpr const char* srcCfgMgrBasePath =
+    "/xyz/openbmc_project/control/service";
+static constexpr const char* srcCfgMgrIntf =
+    "/xyz/openbmc_project.Control.Service.Manager";
+static constexpr const char* sockAttrPropPort = "Port";
+static constexpr const char* srvCfgPropMasked = "Masked";
+static constexpr const char* srvCfgPropEnabled = "Enabled";
+static constexpr const char* srvCfgPropRunning = "Running";
+
+enum class UpdatedProp
+{
+    port = 1,
+    maskedState,
+    enabledState,
+    runningState
+};
+
+using VariantType =
+    std::variant<std::string, int64_t, uint64_t, double, int32_t, uint32_t,
+                 int16_t, uint16_t, uint8_t, bool,
+                 std::vector<std::tuple<std::string, std::string>>>;
+
+class ServiceConfig
+{
+  public:
+    ServiceConfig(sdbusplus::asio::object_server& srv_,
+                  std::shared_ptr<sdbusplus::asio::connection>& conn_,
+                  const std::string& objPath_, const std::string& baseUnitName,
+                  const std::string& instanceName,
+                  const std::string& serviceObjPath,
+                  const std::string& socketObjPath);
+    ~ServiceConfig() = default;
+
+    std::shared_ptr<sdbusplus::asio::connection> conn;
+    uint8_t updatedFlag;
+
+    void stopAndApplyUnitConfig(boost::asio::yield_context yield);
+    void restartUnitConfig(boost::asio::yield_context yield);
+    void startServiceRestartTimer();
+
+  private:
+    sdbusplus::asio::object_server& server;
+    std::shared_ptr<sdbusplus::asio::dbus_interface> srvCfgIface;
+    std::shared_ptr<sdbusplus::asio::dbus_interface> sockAttrIface;
+
+    bool internalSet = false;
+    std::string objPath;
+    std::string baseUnitName;
+    std::string instanceName;
+    std::string instantiatedUnitName;
+    std::string serviceObjectPath;
+    std::string socketObjectPath;
+    std::string overrideConfDir;
+
+    // Properties
+    std::string activeState;
+    std::string subState;
+    uint16_t portNum;
+    std::vector<std::string> channelList;
+    std::string protocol;
+    std::string stateValue;
+    bool unitMaskedState = false;
+    bool unitEnabledState = false;
+    bool unitRunningState = false;
+    std::string subStateValue;
+
+    bool isMaskedOut();
+    void registerProperties();
+    void queryAndUpdateProperties();
+    void createSocketOverrideConf();
+    void updateServiceProperties(
+        const boost::container::flat_map<std::string, VariantType>&
+            propertyMap);
+    void updateSocketProperties(
+        const boost::container::flat_map<std::string, VariantType>&
+            propertyMap);
+    std::string getSocketUnitName();
+    std::string getServiceUnitName();
+};
+
+} // namespace service
+} // namespace phosphor
diff --git a/inc/utils.hpp b/inc/utils.hpp
index e4a31bb..c9df6ae 100644
--- a/inc/utils.hpp
+++ b/inc/utils.hpp
@@ -1,64 +1,64 @@
-/*
-// Copyright (c) 2018 Intel Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-*/
-#pragma once
-#include <boost/asio.hpp>
-#include <phosphor-logging/elog-errors.hpp>
-#include <sdbusplus/asio/object_server.hpp>
-#include <xyz/openbmc_project/Common/error.hpp>
-
-#include <chrono>
-#include <ctime>
-#include <filesystem>
-#include <string>
-
-static constexpr const char* sysdStartUnit = "StartUnit";
-static constexpr const char* sysdStopUnit = "StopUnit";
-static constexpr const char* sysdRestartUnit = "RestartUnit";
-static constexpr const char* sysdReloadMethod = "Reload";
-static constexpr const char* sysdGetJobMethod = "GetJob";
-static constexpr const char* sysdReplaceMode = "replace";
-static constexpr const char* dBusGetAllMethod = "GetAll";
-static constexpr const char* dBusGetMethod = "Get";
-static constexpr const char* sysdService = "org.freedesktop.systemd1";
-static constexpr const char* sysdObjPath = "/org/freedesktop/systemd1";
-static constexpr const char* sysdMgrIntf = "org.freedesktop.systemd1.Manager";
-static constexpr const char* sysdUnitIntf = "org.freedesktop.systemd1.Unit";
-static constexpr const char* sysdSocketIntf = "org.freedesktop.systemd1.Socket";
-static constexpr const char* dBusPropIntf = "org.freedesktop.DBus.Properties";
-static constexpr const char* stateMasked = "masked";
-static constexpr const char* stateEnabled = "enabled";
-static constexpr const char* stateDisabled = "disabled";
-static constexpr const char* subStateRunning = "running";
-
-static inline std::string addInstanceName(const std::string& instanceName,
-                                          const std::string& suffix)
-{
-    return (instanceName.empty() ? "" : suffix + instanceName);
-}
-
-void systemdDaemonReload(
-    const std::shared_ptr<sdbusplus::asio::connection>& conn,
-    boost::asio::yield_context yield);
-
-void systemdUnitAction(const std::shared_ptr<sdbusplus::asio::connection>& conn,
-                       boost::asio::yield_context yield,
-                       const std::string& unitName,
-                       const std::string& actionMethod);
-
-void systemdUnitFilesStateChange(
-    const std::shared_ptr<sdbusplus::asio::connection>& conn,
-    boost::asio::yield_context yield, const std::vector<std::string>& unitFiles,
-    const std::string& unitState, bool maskedState, bool enabledState);
+/*
+// Copyright (c) 2018 Intel Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+*/
+#pragma once
+#include <boost/asio.hpp>
+#include <phosphor-logging/elog-errors.hpp>
+#include <sdbusplus/asio/object_server.hpp>
+#include <xyz/openbmc_project/Common/error.hpp>
+
+#include <chrono>
+#include <ctime>
+#include <filesystem>
+#include <string>
+
+static constexpr const char* sysdStartUnit = "StartUnit";
+static constexpr const char* sysdStopUnit = "StopUnit";
+static constexpr const char* sysdRestartUnit = "RestartUnit";
+static constexpr const char* sysdReloadMethod = "Reload";
+static constexpr const char* sysdGetJobMethod = "GetJob";
+static constexpr const char* sysdReplaceMode = "replace";
+static constexpr const char* dBusGetAllMethod = "GetAll";
+static constexpr const char* dBusGetMethod = "Get";
+static constexpr const char* sysdService = "org.freedesktop.systemd1";
+static constexpr const char* sysdObjPath = "/org/freedesktop/systemd1";
+static constexpr const char* sysdMgrIntf = "org.freedesktop.systemd1.Manager";
+static constexpr const char* sysdUnitIntf = "org.freedesktop.systemd1.Unit";
+static constexpr const char* sysdSocketIntf = "org.freedesktop.systemd1.Socket";
+static constexpr const char* dBusPropIntf = "org.freedesktop.DBus.Properties";
+static constexpr const char* stateMasked = "masked";
+static constexpr const char* stateEnabled = "enabled";
+static constexpr const char* stateDisabled = "disabled";
+static constexpr const char* subStateRunning = "running";
+
+static inline std::string addInstanceName(const std::string& instanceName,
+                                          const std::string& suffix)
+{
+    return (instanceName.empty() ? "" : suffix + instanceName);
+}
+
+void systemdDaemonReload(
+    const std::shared_ptr<sdbusplus::asio::connection>& conn,
+    boost::asio::yield_context yield);
+
+void systemdUnitAction(const std::shared_ptr<sdbusplus::asio::connection>& conn,
+                       boost::asio::yield_context yield,
+                       const std::string& unitName,
+                       const std::string& actionMethod);
+
+void systemdUnitFilesStateChange(
+    const std::shared_ptr<sdbusplus::asio::connection>& conn,
+    boost::asio::yield_context yield, const std::vector<std::string>& unitFiles,
+    const std::string& unitState, bool maskedState, bool enabledState);
