#!/bin/sh
# Copyright (c) 2009-2010 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# dev-mode functionality for crosh

if [ "$(basename $0)" = "crosh-dev" ]; then
  exec "$(dirname $0)/crosh --dev"
fi

DEV_HELP='
 packet_capture [ --device <device> ] [ --frequency <frequency> ] "
                [ --ht-location <above|below> ] "
                [ --monitor-connection-on <monitored_device> ]"
  Start packet capture.  Start a device-based capture on <device>,
  or do an over-the-air capture on <frequency> with an optionally
  provided HT channel location.  An over-the-air capture can also
  be initiated using the channel parameters of a currently connected
  <monitored_device>.  Note that over-the-air captures are not available
  with all 802.11 devices.

 shell
  Open a command line shell.

 systrace [<start | stop | status>]
  Start/stop system tracing.  Turning tracing off will generate a trace
  log file in the Downloads directory with all the events collected
  since the last time tracing was enabled.  One can control the events
  collected by specifying categories after "start"; e.g. "start gfx"
  will collect only graphics-related system events.  "systrace status"
  (or just "systrace") will display the current state of tracing, including
  the set of events being traced.
'

HELP="$HELP$DEV_HELP"

cmd_packet_capture() {
  local option="dict:string:variant:"

  # NB: use printf to avoid echo interpreting -n
  while [ "$(printf '%s' "$1" | cut -c1)" = "-" ]; do
    # Do just enough parsing to filter/map options; we
    # depend on debugd and capture_utility to handle final validation
    if [ "$1" = "--device" ]; then
      shift; option="${option}device,string:$1,"
    elif [ "$1" = "--frequency" ]; then
      shift; option="${option}frequency,int32:$1,"
    elif [ "$1" = "--ht-location" ]; then
      shift; option="${option}ht_location,string:$1,"
    elif [ "$1" = "--monitor-connection-on" ]; then
      shift; option="${option}monitor_connection_on,string:$1,"
    else
      echo "Unknown option: $1"
      return 1
    fi

    shift
  done

  option=$(echo "$option" | sed 's/,$//')

  local downloads_dir="/home/${USER}/user/Downloads"
  if ! capture_file=$(mktemp ${downloads_dir}/packet_capture_XXXX.pcap); then
    echo "Couldn't create capture file."
    return 1
  fi
  local fifo="$(mk_fifo)"
  debugd PacketCaptureStart "fd:1" "fd:3" "$option" \
      2>&1 > "$fifo" 3>${capture_file} &
  read pid < "$fifo"
  echo "pid: $pid"
  (while read line; do echo "$line"; done) < "$fifo"
  debugd PacketCaptureStop "string:$pid"
  if [ $? -ne 0 ]; then
    echo "Can't stop packet capture"
    return 1
  fi
  rm -rf "$(dirname ${fifo})"
  if [ -s "${capture_file}" ]; then
    echo "Capture stored in ${capture_file}"
  else
    echo "No packets captured!"
    rm -f "${capture_file}"
  fi
}

cmd_shell() {
 local shell="/bin/sh"
 if [ -x /bin/bash ]; then
   shell="/bin/bash"
 fi
 SHELL=${shell} ${shell} -l
}

cmd_systrace() {
  case x"$1" in
  xstart)
    local categories;
    shift; categories="$*"
    if [ -z "${categories}" ]; then
       categories="all"
    fi
    debugd SystraceStart "string:${categories}"
    ;;
  xstop)
    local downloads_dir="/home/${USER}/user/Downloads"
    local data_file=$(mktemp ${downloads_dir}/systrace.XXXX)
    if [ $? -ne 0 ]; then
      echo "Cannot create data file ${data_file}"
      return 1
    fi
    debugd SystraceStop "fd:1" > "${data_file}"
    echo "Trace data saved to ${data_file}"
    # add symlink to the latest capture file
    ln -sf $(basename $data_file) ${downloads_dir}/systrace.latest
    ;;
  xstatus|x)
    debugd SystraceStatus
    ;;
  esac
}
