Support adding backend grpc port to netsim ini file

- Store backend grpc port with key grpc.backend.port in netsim.ini
- Read ini file before writing grpc.port to file to prevent overwriting
  other fields

Test: ninja -C objs netsimd
Change-Id: I748dd06f823b4421c40b56be9e03fa3d8974fa28
diff --git a/src/frontend/frontend_server.cc b/src/frontend/frontend_server.cc
index 386118d..f743191 100644
--- a/src/frontend/frontend_server.cc
+++ b/src/frontend/frontend_server.cc
@@ -103,6 +103,7 @@
   // Writes port to ini file.
   auto filepath = osutils::GetDiscoveryDirectory().append("netsim.ini");
   IniFile iniFile(filepath);
+  iniFile.Read();
   iniFile.Set("grpc.port", std::to_string(selected_port));
   iniFile.Write();
 
diff --git a/src/util/os_utils.cc b/src/util/os_utils.cc
index 84c2bcd..9ffb470 100644
--- a/src/util/os_utils.cc
+++ b/src/util/os_utils.cc
@@ -63,7 +63,7 @@
   return path;
 }
 
-std::optional<std::string> GetServerAddress() {
+std::optional<std::string> GetServerAddress(bool frontend_server) {
   auto filepath = osutils::GetDiscoveryDirectory().append("netsim.ini");
   if (!std::filesystem::exists(filepath)) {
     BtsLog("Unable to find discovery directory: %s", filepath.c_str());
@@ -75,7 +75,7 @@
   }
   IniFile iniFile(filepath);
   iniFile.Read();
-  return iniFile.Get("grpc.port");
+  return iniFile.Get(frontend_server ? "grpc.port" : "grpc.backend.port");
 }
 }  // namespace osutils
 }  // namespace netsim
diff --git a/src/util/os_utils.h b/src/util/os_utils.h
index d7f8593..531cda7 100644
--- a/src/util/os_utils.h
+++ b/src/util/os_utils.h
@@ -32,6 +32,6 @@
 /**
  * Return the frontend grpc port.
  */
-std::optional<std::string> GetServerAddress();
+std::optional<std::string> GetServerAddress(bool frontend_server = true);
 }  // namespace osutils
 }  // namespace netsim