// Copyright 2018 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 "garnet/bin/debug_agent/launcher.h"

#include <inttypes.h>

#include "garnet/bin/debug_agent/object_util.h"

namespace debug_agent {

Launcher::Launcher(std::shared_ptr<component::Services> env_services)
    : builder_(env_services) {}

zx_status_t Launcher::Setup(const std::vector<std::string>& argv) {
  zx_status_t status = builder_.LoadPath(argv[0]);
  if (status != ZX_OK)
    return status;

  builder_.AddArgs(argv);

  /*
  Transferring STDIO handles is currently disabled. When doing local debugging
  sharing stdio currently leaves the debugger UI in an inconsistent state and
  stdout doesn't work. Instead we need to redirect stdio in a way the debugger
  can control.

  builder_.CloneStdio();
  */
  builder_.CloneJob();
  builder_.CloneNamespace();
  builder_.CloneEnvironment();

  return builder_.Prepare(nullptr);
}

zx::process Launcher::GetProcess() const {
  zx::process process;
  builder_.data().process.duplicate(ZX_RIGHT_SAME_RIGHTS, &process);
  return process;
}

zx_status_t Launcher::Start() { return builder_.Start(nullptr); }

}  // namespace debug_agent
