#! /bin/sh

# killall - Envoie le signal indiqu  tous les processus correspondant
#    un nom spcifi.

# Par dfaut, ceci ne tue que les processus appartenant au mme
#   utilisateur, sauf si on est root. Utilisez 
#   -s SIGNAL pour spcifier un signal  envoyer au processus, 
#   -u utilisateur pour spcifier l'utilisateur,
#   -t tty pour spcifier un tty (terminal),
#   et -n pour une simulation de fonctionnement.

signal="-INT"    # signal par dfaut
user=""   tty=""   donothing=0

while getopts "s:u:t:n" opt; do
  case "$opt" in
        # Remarquez l'astuce: kill demande -SIGNAL mais nous demandons 
        # SIGNAL; nous introduisons donc le - comme une partie de
        # l'affectation
   s ) signal="-$OPTARG";               ;;
   u ) if [ ! -z "$tty" ] ; then 
         echo "$0: erreur: -u et -t sont mutuellement exclusifs." >&2 
         exit 1
       fi
       user=$OPTARG;                    ;;
   t ) if [ ! -z "$user" ] ; then 
         echo "$0: erreur: -u et -t sont mutuellement exclusifs." >&2 
         exit 1
       fi
       tty=$2;                          ;;
   n ) donothing=1;                     ;;
   ? ) echo "Syntaxe: $0 [-s signal] [-u utilisateur|-t tty] [-n] motif" >&2
       exit 1 
  esac 
done

shift $(( $OPTIND - 1 ))

if [ $# -eq 0 ] ; then 
  echo "Syntaxe: $0 [-s signal] [-u utilisateur|-t tty] [-n] motif" >&2
  exit 1
fi

if [ ! -z "$tty" ] ; then 
  pids=$(ps cu -t $tty | awk "/ $1$/ { print \$2 }") 
elif [ ! -z "$user" ] ; then 
  pids=$(ps cu -U $user | awk "/ $1$/ { print \$2 }")
else 
  pids=$(ps cu -U ${USER:-LOGNAME} | awk "/ $1$/ { print \$2 }") 
fi

if [ -z "$pids" ] ; then 
  echo "$0: aucun processus ne correspond au motif $1" >&2; exit 1 
fi

for pid in $pids
do
  # On envoie le signal $signal  l'identifiant de processus $pid: 
  # kill pourra rler si le processus a pris fin, si l'utilisateur
  #   n'a pas le droit de le tuer, etc., mais ce n'est pas grave.
  if [ $donothing -eq 1 ] ; then
    echo "kill $signal $pid" 
  else  
    kill $signal $pid 
  fi 
done

exit 0
