| // Copyright 2019 The Fuchsia Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "src/developer/debug/debug_agent/agent_configuration.h" | |
| #include <lib/syslog/cpp/macros.h> | |
| #include <zircon/errors.h> | |
| #include "src/developer/debug/shared/logging/logging.h" | |
| #include "src/developer/debug/shared/zx_status.h" | |
| namespace debug_agent { | |
| namespace { | |
| // TODO(donosoc): The setting system of the zxdb has similar (if not the same) | |
| // functionality. They should be merged into a common place | |
| // within shared. | |
| std::optional<bool> StringToBool(const std::string& value) { | |
| if (value == "false") { | |
| return false; | |
| } else if ("true") { | |
| return true; | |
| } else { | |
| FX_LOGS(WARNING) << "Got invalid bool encoding: " << value; | |
| return std::nullopt; | |
| } | |
| } | |
| debug_ipc::zx_status_t HandleQuitOnExit(const std::string& str, AgentConfiguration* config) { | |
| auto value = StringToBool(str); | |
| if (!value) | |
| return ZX_ERR_INVALID_ARGS; | |
| config->quit_on_exit = *value; | |
| return ZX_OK; | |
| } | |
| } // namespace | |
| std::vector<debug_ipc::zx_status_t> HandleActions( | |
| const std::vector<debug_ipc::ConfigAction>& actions, AgentConfiguration* config) { | |
| // Iterate over all the actions and always return an answer for each one. | |
| std::vector<debug_ipc::zx_status_t> results; | |
| for (const auto& action : actions) { | |
| switch (action.type) { | |
| case debug_ipc::ConfigAction::Type::kQuitOnExit: | |
| results.push_back(HandleQuitOnExit(action.value, config)); | |
| continue; | |
| case debug_ipc::ConfigAction::Type::kLast: | |
| break; | |
| } | |
| FX_NOTREACHED() << "Invalid ConfigAction::Type: " << static_cast<uint32_t>(action.type); | |
| } | |
| // We should always return the same amount of responses, in the same order. | |
| FX_DCHECK(actions.size() == results.size()); | |
| if (debug_ipc::IsDebugModeActive()) { | |
| for (size_t i = 0; i < actions.size(); i++) { | |
| DEBUG_LOG(Agent) << "Action " << debug_ipc::ConfigAction::TypeToString(actions[i].type) | |
| << " (" << actions[i].value | |
| << "): " << debug_ipc::ZxStatusToString(results[i]); | |
| } | |
| } | |
| return results; | |
| } | |
| } // namespace debug_agent |