Figure 6. The Remote-slirp-off Script

  #!/bin/sh
  #
  ## remote-slirp-off -- turn off remote SLiRP and hangup modem

  # this script expects a modem to be on both stdin and stdout,
  # e.g. `remote-slirp-off </dev/modem >/dev/modem

  # exit status
  sts=0

  # help function
  function prthlp()
  {
    echo ""
    echo "usage: $0 [-v]"
    echo ""
    echo "exit remote SLiRP and hangup modem. we expect the modem not to be"
    echo "locked, and we expect our standard input and standard output to be"
    echo "connected to the modem. E.g.:"
    echo ""
    echo " $0 </dev/modem >/dev/modem"
    echo ""
    echo "options:"
    echo "-v verbose operation; logs chat to system log."
    echo ""
  }

  # option defaults
  # not blank => verbose chat operation
  opt_vrbopr=""

  # various options
  for i in $*; do
    case $i in
      -v | --verbose)
        opt_vrbopr="-v"
        shift
        ;;
      -h | --help)
        prthlp
        exit 0
        ;;
      *) break
        ;;
    esac
  done

  function sndxitcmd()
  {
    chat $opt_vrbopr \
    TIMEOUT 1 \
    "" 0\\d\\c \
    "" 0\\d\\c \
    "" 0\\d\\c \
    "" 0\\d\\c \
    "" 0\\d\\c
    return
  }

  function hupmdm()
  {
    chat $opt_vrbopr \
    TIMEOUT 10 \
    "" \\p+\\p+\\p+\\c \
    OK ath0 \
    OK ""
    return
  }

  # send SLiRP exit signal
  echo -n "exiting remote SLiRP ... " 1>&2
  if sndxitcmd ; then
    echo "done." 1>&2

    # hangup modem
    echo -n "hanging up modem ... " 1>&2
    if hupmdm ; then
      echo "done." 1>&2
    else
      echo -e "\nerror: could not hang up modem." 1>&2
      sts=1
    fi
  else
    echo "\nerror: could not send exit command." 1>&2
    sts=1
  fi

  exit $sts