OpenBSD-4.6/regress/sbin/isakmpd/exchange/run.sh

#!/bin/sh
#	$OpenBSD: run.sh,v 1.1 2005/04/08 17:12:49 cloder Exp $
#	$EOM: run.sh,v 1.6 1999/08/05 15:02:33 niklas Exp $

#
# Copyright (c) 1998, 1999 Niklas Hallqvist.  All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#

#
# This code was written under funding by Ericsson Radio Systems.
#

# Defaults
SRCPORT=1500
DSTPORT=1501
FIFO=test.fifo
TIMEOUT=2

NC=${NC:-/usr/bin/nc}
ISAKMPD=${ISAKMPD:-/sbin/isakmpd}

progname=`basename $0`
indent=`echo -n $progname |sed 's/./ /g'`
seed=980801
initiator=yes
retval=0
verbose=no
clean=yes

usage ()
{
  echo "usage: $progname [-nrv] [-d dst-port] [-f fifo] [-s src-port]" >&2
  echo "       $indent [-t timeout] testsuite" >&2
  exit 2
}

set -- `getopt d:f:nrs:t:v $*`
if [ $? != 0 ]; then
  usage
fi
for i; do
  case "$i" in
  -d)
    DSTPORT=$2; shift; shift;;
  -f)
    FIFO=$2; shift; shift;;
  -n)
    clean=no; shift;;
  -r)
    initiator=no; shift;;
  -s)
    SRCPORT=$2; shift; shift;;
  -t)
    TIMEOUT=$2; shift; shift;;
  -v)
    verbose=yes; shift;;
  --)
    shift; break;;
  esac
done

if [ $# -eq 1 ]; then
  suite=$1
else
  usage
fi

[ ${verbose} = yes ] && set -x

# Start isakmpd and wait for the fifo to get created
echo Removing ${FIFO}
rm -f ${FIFO}
${ISAKMPD} -d -p${SRCPORT} -f${FIFO} -r${seed} &
isakmpd_pid=$!
echo isakmpd pid is $isakmpd_pid
trap 'echo Got signal; kill $isakmpd_pid; echo Removing ${FIFO}; rm -f ${FIFO}; [ $clean = yes ] && rm -f packet' 1 2 15
while [ ! -p ${FIFO} ]; do
  sleep 1
done

# Start the exchange
if [ $initiator = yes ]; then
  ${NC} -nul -w${TIMEOUT} 127.0.0.1 ${DSTPORT} </dev/null >packet &
#  ${NC} -nu -w${TIMEOUT} -p${SRCPORT} 127.0.0.1 ${DSTPORT} </dev/null >packet
  sleep 1
  echo "c udp 127.0.0.1:${DSTPORT} 2 1" >${FIFO}
  in_packets=`ls ${suite}-i.* 2>/dev/null`
  out_packets=`ls ${suite}-r.* 2>/dev/null`
else
  in_packets=`ls ${suite}-r.* 2>/dev/null`
  out_packets=`ls ${suite}-i.* 2>/dev/null`
fi
his_turn=$initiator
while [ \( $his_turn = yes -a X"$in_packets" != X \) \
        -o \( $his_turn = no -a X"$out_packets" != X \) ]; do
  if [ $his_turn = no ]; then
    set $out_packets
    packet=$1
    shift
    out_packets=$*
    cat $packet |${NC} -nu -w${TIMEOUT} -p${SRCPORT} 127.0.0.1 ${DSTPORT} \
      >packet
    my_turn=no
  else
    set $in_packets
    packet=$1
    shift
    in_packets=$*
    if ! cmp $packet packet 2>/dev/null; then
      retval=1
      break
    fi
    my_turn=yes
  fi
done
kill $isakmpd_pid
rm -f ${FIFO}
[ $clean = yes ] && rm -f packet
exit $retval