Adding multiconfig support in android-info

To enable android-info.txt to have multiple guest config options,
remove the requirement that config be at the front of android_info.

Bug: 310326103
Test: local boot of tablet and other targets
Change-Id: Ic9714f3038a5737277cea41589ad350efff9b0b4
Merged-In: Ic9714f3038a5737277cea41589ad350efff9b0b4
diff --git a/host/libs/config/config_flag.cpp b/host/libs/config/config_flag.cpp
index d4d5157..63afd23 100644
--- a/host/libs/config/config_flag.cpp
+++ b/host/libs/config/config_flag.cpp
@@ -16,6 +16,7 @@
 
 #include "host/libs/config/config_flag.h"
 
+#include <android-base/file.h>
 #include <android-base/logging.h>
 #include <android-base/strings.h>
 #include <gflags/gflags.h>
@@ -34,6 +35,8 @@
 DEFINE_string(system_image_dir, CF_DEFAULTS_SYSTEM_IMAGE_DIR, "");
 
 using gflags::FlagSettingMode::SET_FLAGS_DEFAULT;
+using android::base::ReadFileToString;
+using android::base::Split;
 
 namespace cuttlefish {
 
@@ -192,22 +195,36 @@
     if (!FileExists(info_path)) {
       return {};
     }
-    std::ifstream ifs{info_path};
-    if (!ifs.is_open()) {
-      return {};
-    }
     std::string android_info;
-    ifs >> android_info;
-    std::string_view local_android_info(android_info);
-    if (!android::base::ConsumePrefix(&local_android_info, "config=")) {
+    if(!ReadFileToString(info_path, &android_info)) {
       return {};
     }
-    if (!config_reader_.HasConfig(std::string{local_android_info})) {
+    // grab the last value of config in android-info.txt,
+    // it's the setting that's respected.
+    // TODO (rammuthiah) Replace this logic with ParseMiscInfo
+    // from host/commands/assemble_cvd/misc_info.h
+    // Currently blocked on linking error for misc_info which is part of
+    // assemble_cvd and this bit of code which is in run_cvd.
+    size_t config_idx = android_info.rfind("config=");
+    if (config_idx == std::string::npos) {
+      return {};
+    }
+    std::string config_value = android_info.substr(config_idx);
+    std::string_view local_config_value(config_value);
+    if (!android::base::ConsumePrefix(&local_config_value, "config=")) {
+      return {};
+    }
+    auto split_config = Split(std::string{local_config_value},"\n");
+    if (split_config.empty()) {
+      return {};
+    }
+    config_value = split_config[0];
+    if (!config_reader_.HasConfig(config_value)) {
       LOG(WARNING) << info_path << " contains invalid config preset: '"
-                   << local_android_info << "'.";
+                   << config_value << "'.";
       return {};
     }
-    return std::string{local_android_info};
+    return config_value;
   }
 
   ConfigReader& config_reader_;