#/bin/sh

# rustin netstat, based on /proc/net/tcp
# Handle only TCP connections

# by M. Andreoli for MuLinux, 2000


#set -x

# convert a sigle hex digit 0-F: h->d

dec()
{
case $1 in
[0-9]) 	echo $1;;
A)	echo 10;;
B)	echo 11;;
C)	echo 12;;
D)	echo 13;;
E)	echo 14;;
F)	echo 15;;
esac

}

# convert 2 hex digit: hh->d

hd2()
{
E=`echo $1 | sed "s/\(.\)/\1 /g"`
set -- $E

x1=`dec $1`
x2=`dec $2`

r2=$x2
r1=`expr $x1 \* 16`

echo `expr $r1 + $r2`
}

# convert 4 hex digit: hhhh->d

hd4()
{
E=`echo $1 | sed "s/\(.\)/\1 /g"`
set -- $E

x1=`dec $1`
x2=`dec $2`
x3=`dec $3`
x4=`dec $4`

r4=$x4
r3=`expr $x3 \* 16`
r2=`expr $x2 \* 256`
r1=`expr $x1 \* 4096`

r=$r1
r=`expr $r + $r2`
r=`expr $r + $r3`
r=`expr $r + $r4`

echo $r
}

# convert IPADDRE 32bit -> dot quoted notation: hhhhhhhh-> d.d.d.d

get_ip()
{
E=`echo $1 | sed "s/\(..\)/\1 /g"`
set -- $E
x4=`hd2 $1`
x3=`hd2 $2`
x2=`hd2 $3`
x1=`hd2 $4`

echo $x1.$x2.$x3.$x4
}

# get user owner of IP

get_user()
{
IP=$1

if [ -z "`which who`" ] ; then
	echo "UNKNOWN"
	return
fi	

set -- `who | sed -n /$IP/P`
echo $1

}

# MAIN


case "Z$1" in
Z-h)
	echo "(rustic) netstat, (C) M. Andreoli"
	echo "Usage: netstat [-h] [-c]"
	exit 1
	;;
Z-c)
	refresh=yes
	;;
esac

while [ 1 ] ; do
printf "%2s %24s %24s %10s" '' local remote user
echo

cat /proc/net/tcp |
while read n la ra rest
do

[ $n = sl ] && continue

save=$IFS; IFS=":" 
set -- $la; loc_ip=$1; loc_port=$2
set -- $ra; rem_ip=$1; rem_port=$2
IFS=$save

dloc_port=`hd4 $loc_port`
drem_port=`hd4 $rem_port`

dloc_ip=`get_ip $loc_ip`
drem_ip=`get_ip $rem_ip`
user=`get_user $drem_ip`

if [ $dloc_port -ne 0 ] && [ $drem_port -ne 0 ]
then
	printf "%2s %24s %24s %10s" \
	$n $dloc_ip:$dloc_port $drem_ip:$drem_port $user
	echo
fi
done

[ -z "$refresh" ] && break
done
