blob: 5c910e66f795a65e5e6ba8bb8be1d3d2b20c11b0 [file] [log] [blame]
// Copyright 2023 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.
#ifndef SRC_DEVELOPER_DEBUG_ZXDB_LOCAL_AGENT_H_
#define SRC_DEVELOPER_DEBUG_ZXDB_LOCAL_AGENT_H_
#include <memory>
#include <fbl/unique_fd.h>
#include "lib/fit/function.h"
#include "src/developer/debug/shared/buffered_bidi_pipe.h"
namespace zxdb {
struct LocalAgentResult {
enum Status {
// The fork request or something similar failed. An error message will have already been printed
// to the screen and the caller should exit with the exit_code.
kFailed,
// The fork succeeded and the caller should continue. The agent_pid and pipe members will be
// valid and should be used to communicate with the forked agent. The caller should be sure
// to waitpid() on the agent_pid before exiting to prevent a zombie.
kSuccess,
// This is the forked process running the debug agent. The caller should exit with the exit_code
// (representing the return value of the forked process).
kInForked
};
Status status = kFailed;
// Valid for kFailed or kInForked.
int exit_code = 0;
// Valid only for kSuccess.
int agent_pid = 0; // PID of the forked debug_agent process.
std::unique_ptr<debug::BufferedBidiPipe> pipe;
LocalAgentResult(Status status, int exit_code) : status(status), exit_code(exit_code) {}
LocalAgentResult(int agent_pid, std::unique_ptr<debug::BufferedBidiPipe> pipe)
: status(kSuccess), agent_pid(agent_pid), pipe(std::move(pipe)) {}
};
// Creates a debug_agent by forking this process and running the agent code in the resulting
// process.
LocalAgentResult ForkLocalAgent();
} // namespace zxdb
#endif // SRC_DEVELOPER_DEBUG_ZXDB_LOCAL_AGENT_H_