#!/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 dnsconfd daemon:

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

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

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

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

avahidns_restart()
{
  avahidns_stop
  avahidns_start
}

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

