#!/bin/bash
# output filtering strings for lkstla
# Copyright (C) HITACHI,LTD. 2005
# WRITTEN BY HITACHI SYSTEMS DEVELOPMENT LABORATORY,
# Created by H.Kawai <h-kawai@sdl.hitachi.co.jp>

PROGNAME=`echo $0 | sed -e 's|^.*/||'`
FOLLOW_CHILDREN=0
TMP=

trap 'cleanup $?' SIGINT SIGHUP SIGTERM SIGQUIT EXIT

function cleanup() {
    if [ -f "$TMP" ]; then
	rm $TMP
    fi
    exit $1
}

function usage() {
    cat << EOF 1>&2
$PROGNAME generates filtering strings for lkstla. You can use
this script such as...
  \$ lkstla syscall -p \`$PROGNAME procname.txt bash\` lkstlog

Usage: $PROGNAME [-f] <procname_list> <procname> [procname...]
  procname_list  output of lkst_proc_list without -t option
       procname  process name desired to be passed
      !procname  process name desired to be filtered
             -f  follow all child processes
EOF
}

OPTS=`getopt -- f "$@"`
if [ $? -ne 0 ]; then
    usage
    exit 1
fi
eval set -- $OPTS

while [ $# -gt 0 ]; do
    case $1 in
	-f)
	    FOLLOW_CHILDREN=1
	    shift
	    ;;
	--)
	    shift
	    break
	    ;;
	*)
	    usage
	    exit 1
	    ;;
    esac
done

if [ $# -lt 2 ]; then
    usage
    exit 1
fi

PROCLIST="$1"
shift
i=0
j=0
for n in $*; do
    case $n in
	!*)
	    IPNAMES[$i]=`echo $n | sed -e 's/^!//'`
	    let i++
	    ;;
	*)
	    PNAMES[$j]=$n
	    let j++
	    ;;
    esac
done

TMP=`mktemp tmp$$.XXXXXX`
tail -n+2 "$PROCLIST" | sort -k5 -nr | sort -k1 -nsu | sort -k5 -n > $TMP
comma=
while read PID _PPID TGID NAME OTHERS; do

    for i in ${IPNAMES[*]} ; do
	if [ $NAME = $i ]; then
	    echo -n "${comma}!$PID"
	    comma=","
	    IPARENTS[PID]=$PID
	    break
	fi
    done
    for i in ${PNAMES[*]} ; do
	if [ $NAME = $i ]; then
	    echo -n "${comma}$PID"
	    comma=","
	    PARENTS[PID]=$PID
	    break
	fi
    done
done < $TMP

if [ $FOLLOW_CHILDREN -eq 0 ]; then
    # normal exit
    exit 0
fi

# follow children

while read PID _PPID OTHERS ; do
    if [ "${IPARENTS[_PPID]}" = $_PPID ]; then
	echo -n ",!$PID"
	IPARENTS[PID]=$PID
    fi
    if [ "${PARENTS[_PPID]}" = $_PPID ]; then
	echo -n ",$PID"
	PARENTS[PID]=$PID
    fi
done < $TMP

exit 0
