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_;