#!/bin/ksh
# Name: truss.sh
# Purpose: to make AIX trace look like the truss command
# Caveat:  Unsupported tool. Use at your own risk.

show_usage()
{
 echo "Usage: $0 [-P] [-n] [-p pid] [-t tempfile][-s sleeptime | command]"
        echo "         -P           show process id's in the output"
        echo "         -n           show process names in the output"
        echo "         -p pid       trcrpt only for this pid"
 echo "         -s seconds   trace for  period of time"
 echo "         -t tempfile  path name to file that will be used for trace"
        echo "         command      execute this command and stop trace\c"
 echo " after command is done.\n"
 exit 0
}

[ "$#" = 0 ] && show_usage
set -- `getopt t:s:p:nP "$@"` || show_usage

while :; do
        case $1 in
                -s)     sleeptime=$2
                        shift 2;;
  -p) pid=$2
   shift 2;;
  -n)     EXEC="exec=on,"
   shift;;
  -P) PIDNUM="pid=on,"
   shift;;
                --)     shift
                        break;;
        esac
done

command="$*"
[ -n "$command" -a -n "$sleeptime" ] && show_usage
[ -n "$pid" ] && PID="-p $pid"
 
hooks="101,104,107,106,134,139,15B,130,19C,163,169,120,122,108,12E,14C,154,\
152,15F,14E,137,135,13A,19B,13E,174,175,176,177,178,179,17A,17B,17D,17E,\
17F,1A7,1A8,1A4,1A5,1A6,180,18F,195,18E,1A9,1AA,1AC,1AB,1F0,1AF,1AE,1AD"

do_trace()
{
logsize=$1;bufsize=$2;
trace -n -a -L $logsize -T $bufsize -j $hooks -do trace.out || return $?
}

do_trace 8000000 4000000 || {
 echo "You do not have privilege as this uid to allocate a large trace buffer"
 echo "Trying with a smaller buffer, but you may lose data"
 do_trace 8000000 1000000 || {
  echo "You do not have privilege as this uid to allocate a large trace buffer"
  trcstop
  exit 1
 }
}

trcon

if [ -n "$sleeptime" ]; then
 sleep $sleeptime
else
 $command  # run the command
fi
# do whatever you want here
trcstop
trcrpt -k 106 ${PID} -h -O ${EXEC}${PIDNUM}ids=0,timestamp=3 trace.out  # > trcrpt.out