# 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.

# This library is used by:
# * debug
# * fidlcat

# Checks to see if a debug agent is listening by knocking on the agent
# port with nc(1).
# 1: agent port
# 2: number of tries
check_for_agent() {
  local port="$1"
  local num_tries="$2"

  while ((num_tries--)); do
    if nc -w5 -z "$(get-fuchsia-device-addr)" "${port}"; then
      return 0
    fi
    sleep 1
  done
  return 1
}

# Starts a debug agent on the target if it's not there.
# 1: agent port
# 2: agent unwind flag
# 3: agent output path
# The agent is started in a subprocess that must be waited upon.
launch_debug_agent() {
  local port="$1"
  local unwind_flag="$2"
  local agent_out="$3"
  local debug_agent_url="fuchsia-pkg://fuchsia.com/debug_agent#meta/debug_agent.cmx"

  # See if the debug agent is already there.
  echo "Checking for debug agent on $(get-device-addr-resource):${port}."
  if fx-command-run "shell" "ps" | grep "debug_agent.cmx" > /dev/null; then
    echo "Found agent already running."
    return 0
  fi

  # Leave the SSH connection open. Will be closed on script end.
  # We branch out on whether the user used the verbose-agent flag. If so, we
  # redirect the debug agent output to /dev/null.
  echo -e "Debug agent not found. Starting one."
  fx-command-run "shell" "run" "${debug_agent_url}" "--port=${port}" "${unwind_flag}" > "${agent_out}" 2>&1 &

  # Bug: 49094, with serve-remote this can not detect a running
  # agent the way that check_for_agent attempts to, we sleep a very
  # short time to give the agent a chance to actually start. Ideally
  # zxdb(1) should handle this instead.
  sleep 0.5

  # Wait for the debug agent to start.
  if check_for_agent "${port}" 10; then
    return 0
  else
    fx-error "Timed out trying to find the Debug Agent."
    return 1
  fi
}
