#!/bin/bash

# This file is part of avahi.
#
# avahi is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as
# published by the Free Software Foundation; either version 2 of the
# License, or (at your option) any later version.
#
# avahi is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
# License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with avahi; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
# USA.

# Start/stop/restart the avahi daemon:

PATH=/sbin:/bin:/usr/sbin:/usr/bin
DESC="Avahi mDNS/DNS-SD Daemon"
NAME="avahi-daemon"
DAEMON="@sbindir@/$NAME"

avahid_start()
{
  echo "Starting $DESC:  $DAEMON -D"
  $DAEMON -D
}

avahid_status()
{
  $DAEMON -c
  [ $? = 0 ]
}

avahid_stop()
{
  echo -en "Stopping $DESC: "
  $DAEMON -c
  [ $? != 0 ]
  echo "stopped";
  $DAEMON -k 2>/dev/null
}

avahid_restart()
{
  avahid_stop
  avahid_start
}

case "$1" in
'start')
  if ( ! avahid_status ); then
    avahid_start
  else
    echo "$DESC is already running (will not start it twice)."
  fi
  ;;
'stop')
  avahid_stop
  ;;
'restart')
  avahid_restart
  ;;
'status')
  if ( avahid_status ); then
    echo "$DESC is currently running"
  else
    echo "$DESC is not running."
  fi
  ;;
*)
  echo "usage $0 start|stop|status|restart"
esac

