blob: 932f8a270c59dad70555f39354989730cca7f84a [file] [log] [blame]
/*
* Copyright (C) 2023 The Android Open Source Project
*
* 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.
*/
#include "host/commands/cvd/run_server.h"
#include <memory>
#include "common/libs/utils/flag_parser.h"
#include "common/libs/utils/shared_fd_flag.h"
#include "host/commands/cvd/logger.h"
#include "host/commands/cvd/server.h"
namespace cuttlefish {
bool IsServerModeExpected(const std::string& exec_file) {
return exec_file == kServerExecPath;
}
Result<void> RunServer(const RunServerParam& params) {
if (!params.internal_server_fd->IsOpen()) {
return CF_ERR(
"Expected to be in server mode, but didn't get a server "
"fd: "
<< params.internal_server_fd->StrError());
}
std::unique_ptr<ServerLogger> server_logger =
std::make_unique<ServerLogger>();
CF_EXPECT(server_logger != nullptr, "ServerLogger memory allocation failed.");
std::unique_ptr<ServerLogger::ScopedLogger> scoped_logger;
if (params.carryover_stderr_fd->IsOpen()) {
const auto& verbosity_level = params.verbosity_level;
if (!EncodeVerbosity(verbosity_level).ok()) {
LOG(ERROR) << "Failed to set verbosity level \"" << verbosity_level
<< "\"";
scoped_logger = std::make_unique<ServerLogger::ScopedLogger>(std::move(
CF_EXPECT(server_logger->LogThreadToFd(params.carryover_stderr_fd))));
} else {
scoped_logger = std::make_unique<ServerLogger::ScopedLogger>(
std::move(CF_EXPECT(server_logger->LogThreadToFd(
params.carryover_stderr_fd, verbosity_level))));
}
}
if (params.memory_carryover_fd && !(*params.memory_carryover_fd)->IsOpen()) {
LOG(ERROR) << "Memory carryover file is supposed to be open but is not.";
}
CF_EXPECT(CvdServerMain(
{.internal_server_fd = params.internal_server_fd,
.carryover_client_fd = params.carryover_client_fd,
.memory_carryover_fd = params.memory_carryover_fd,
.acloud_translator_optout = params.acloud_translator_optout,
.server_logger = std::move(server_logger),
.scoped_logger = std::move(scoped_logger)}));
return {};
}
Result<ParseResult> ParseIfServer(std::vector<std::string>& all_args) {
std::vector<Flag> flags;
SharedFD internal_server_fd;
flags.emplace_back(SharedFDFlag("INTERNAL_server_fd", internal_server_fd));
SharedFD carryover_client_fd;
flags.emplace_back(
SharedFDFlag("INTERNAL_carryover_client_fd", carryover_client_fd));
SharedFD carryover_stderr_fd;
flags.emplace_back(
SharedFDFlag("INTERNAL_carryover_stderr_fd", carryover_stderr_fd));
SharedFD memory_carryover_fd;
flags.emplace_back(
SharedFDFlag("INTERNAL_memory_carryover_fd", memory_carryover_fd));
// the server's default verbosity must be VERBOSE, the least LogSeverity
// the LogSeverity control will be done later on by the server by masking
std::string verbosity = "VERBOSE";
flags.emplace_back(GflagsCompatFlag("verbosity", verbosity));
CF_EXPECT(ParseFlags(flags, all_args));
// now the three flags above are all consumed from all_args
std::optional<bool> acloud_translator_optout_opt;
const auto all_args_size_before = all_args.size();
bool acloud_translator_optout_value = false;
flags.emplace_back(GflagsCompatFlag("INTERNAL_acloud_translator_optout",
acloud_translator_optout_value));
CF_EXPECT(ParseFlags({GflagsCompatFlag("INTERNAL_acloud_translator_optout",
acloud_translator_optout_value)},
all_args));
if (all_args.size() != all_args_size_before) {
acloud_translator_optout_opt = acloud_translator_optout_value;
}
std::optional<SharedFD> memory_carryover_fd_opt;
if (memory_carryover_fd->IsOpen()) {
memory_carryover_fd_opt = std::move(memory_carryover_fd);
}
ParseResult result = {
.internal_server_fd = internal_server_fd,
.carryover_client_fd = carryover_client_fd,
.memory_carryover_fd = memory_carryover_fd_opt,
.carryover_stderr_fd = carryover_stderr_fd,
.acloud_translator_optout = acloud_translator_optout_opt,
.verbosity_level = verbosity,
};
return {result};
}
} // namespace cuttlefish