#!/bin/sh
#
#   Copyright (c)  2007             Dmitry K. Butskoy
#                                   <buc@citadel.stu.neva.ru>
#   License:  GPL v2 or any later
#
#   See COPYING for the status of this software.
#

#
#  Shell wrapper providing traceproto(8) command line interface.
#
#  The original implementation of traceproto(8) can be obtained
#  from http://traceproto.sourceforge.net/
#


prgname=$0
opts=""
length=""
method="tcp"
sendwait=100
cont=""
iface=$TP_DEFAULT_IF


usage () {
    echo "Usage: $prgname [-cCTfAhvR] [-p protocol] [-d dst_port] [-D max_dst_port]
	[-s src_port] [-S max_src_port] [-m min_ttl] [-M max_ttl] [-w response_timeout]
	[-W send_delay] [-a account_level] [-P payload_size]
	[-F interface] [-k skips] [-I consecutive_trace_count]
	[-H packets_per_hop] [-i incr_pattern] [-o output_style] [-t tcp_flags]
	target" >&2
}

warning () {
    echo "$prgname: Option '$1' is not implemented in this wrapper" >&2
}
 

PARSED=`getopt 'cCTfAhvRp:d:D:s:S:m:M:w:W:a:P:F:k:I:H:i:o:t:' "$@"`
[ $? != 0 ] && exit 2

eval set -- "$PARSED"

while [ $# -gt 0 ]
do
    case "$1" in
	-p)  method=$2; shift 2 ;;
	-d)  opts="$opts -p $2"; shift 2 ;;
	-s)  opts="$opts --sport=$2"; shift 2 ;;
	-m)  opts="$opts -f $2"; shift 2 ;;
	-M)  opts="$opts -m $2"; shift 2 ;;
	-w)  opts="$opts -w $2"; shift 2 ;;
	-W)  sendwait=$2; shift 2 ;;
	-P)  length=$2; shift 2 ;;
	-c)  cont=100000; shift ;;
	-I)  cont=$2; shift 2 ;;
	-H)  opts="$opts -q $2"; shift 2 ;;
	-f)  opts="$opts -F"; shift ;;
	-F)  iface=$2; shift 2 ;;
	-A)  opts="$opts -A"; shift ;;
	-o)  [ $2 != "c" ] && warning $1; shift 2 ;;
	-t)  case $2 in
		*S*)  opts="$opts -O syn" ;;
	     esac
	     case $2 in
		*A*)  opts="$opts -O ack" ;;
	     esac
	     case $2 in
		*R*)  opts="$opts -O rst" ;;
	     esac
	     case $2 in
		*U*)  opts="$opts -O urg" ;;
	     esac
	     case $2 in
		*P*)  opts="$opts -O psh" ;;
	     esac
	     case $2 in
		*F*)  opts="$opts -O fin" ;;
	     esac
	     case $2 in
		*E*)  opts="$opts -O ece" ;;
	     esac
	     case $2 in
		*C*)  opts="$opts -O cwr" ;;
	     esac
	     shift 2 ;;
	-[DSaki])  warning $1; shift 2 ;;
	-[TCR])  warning $1; shift ;;
	-h)  usage; exit 0 ;;
	-v)  echo "\"traceproto\"-compatible wrapper for new Linux Traceroute" >&2;
	     exit 0 ;;
	--)  shift; break ;;
	*)  echo "$prgname: Internal parsing error" >&2; exit 2 ;;
    esac
done



[ $# -eq 0 ] && {
    usage
    exit 2
}

host=$1


opts="-M $method $opts"
opts="$opts -z $sendwait"
[ -n "$iface" ] && opts="$opts -i $iface"

[ -n "$TP_OUTPUT_STYLE" -a "$TP_OUTPUT_STYLE" != "classic" ] && {
	echo "$prgname: warning: only classic output style supported" >&2
}

[ -n "$TP_RA_SERVER" -a -z "$RA_SERVER" ] && RA_SERVER=$TP_RA_SERVER


[ -z "$cont" ] && exec traceroute $opts $host $length

while [ "$cont" -gt 0 ]
do
    cont=$(($cont - 1))
    traceroute $opts $host $length
done

