#!/bin/sh

# 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.

#
# avahi-dnsconfd     avahi dns configuration daemon
#                               Daemon for ZeroConf
#
# Authors:      <sebastien.estienne@gmail.com>
#

if [ -f /lib/lsb/init-functions ]
then
    . /lib/lsb/init-functions
else
    # int log_begin_message (char *message)
    log_begin_msg () {
        if [ -z "$1" ]; then
	    return 1
        fi
        echo " * $@"
    }

    # int log_end_message (int exitstatus)
    log_end_msg () {
	
    # If no arguments were passed, return
	[ -z "$1" ] && return 1
	
    # Only do the fancy stuff if we have an appropriate terminal
    # and if /usr is already mounted
	TPUT=/usr/bin/tput
	EXPR=/usr/bin/expr
	if [ -x $TPUT ] && [ -x $EXPR ] && $TPUT hpa 60 >/dev/null 2>&1; then
	    COLS=`$TPUT cols`
	    if [ -n "$COLS" ]; then
		COL=`$EXPR $COLS - 7`
	    else
		COL=73
	    fi
	    UP=`$TPUT cuu1`
	    END=`$TPUT hpa $COL`
	    START=`$TPUT hpa 0`
	    RED=`$TPUT setaf 1`
	    NORMAL=`$TPUT op`
	    if [ $1 -eq 0 ]; then
		echo "$UP$END[ ok ]"
	    else
		echo -e "$UP$START $RED*$NORMAL$END[${RED}fail${NORMAL}]"
	    fi
	else
	    if [ $1 -eq 0 ]; then
		echo "   ...done."
	    else
		echo "   ...fail!"
	    fi
	fi
	return $1
    }
    
    log_warning_msg () {
	if log_use_fancy_output; then
	    YELLOW=`$TPUT setaf 3`
	    NORMAL=`$TPUT op`
	    echo "$YELLOW*$NORMAL $@"
	else
	    echo "$@"
	fi
    }

fi

#set -e

PATH=/sbin:/bin:/usr/sbin:/usr/bin
DESC="Avahi Unicast DNS Configuration Daemon"
NAME="avahi-dnsconfd"
DAEMON="@sbindir@/$NAME"
SCRIPTNAME=/etc/init.d/$NAME

# Gracefully exit if the package has been removed.
test -x $DAEMON || exit 0

# don't start if /etc/default/avahi-dnsconfd says so.
AVAHI_DNSCONFD_START=1
test -f /etc/default/avahi-dnsconfd && . /etc/default/avahi-dnsconfd

if [ "$AVAHI_DNSCONFD_START" != "1" -a "$1" != "stop" ]; then
    log_warning_msg "Not starting $DESC $NAME, disabled via /etc/default/$NAME"
    exit 0
fi

#
#       Function that starts the daemon/service.
#
d_start() {
    $DAEMON -c
    [ $? = 0 ] && exit 0

    if [ -s /etc/localtime ]; then
	if [ ! -d /etc/avahi/etc ]; then
	    mkdir -p @sysconfdir@/avahi/etc >/dev/null 2>&1
	fi
	cp -fp /etc/localtime @sysconfdir@/avahi/etc >/dev/null 2>&1
    fi;
    
    $DAEMON -D
}

#
#       Function that stops the daemon/service.
#
d_stop() {
    $DAEMON -c
    [ $? != 0 ] && exit 0

    $DAEMON -k
}

#
#       Function that reload the config file for the daemon/service.
#
d_refresh() {
    $DAEMON -c
    [ $? != 0 ] && exit 0

    $DAEMON -r
}

#
#       Function that check the status of the daemon/service.
#
d_status() {
    $DAEMON -c
    [ $? = 0 ]  && echo "$DESC is running" || echo "$DESC is not running"
}

case "$1" in
    start)
        log_begin_msg "Starting $DESC: $NAME"
        d_start
        log_end_msg $?
        ;;
    stop)
        log_begin_msg "Stopping $DESC: $NAME"
        d_stop
        log_end_msg $?
        ;;
    refresh)
        log_begin_msg "Refreshing $DESC: $NAME"
        d_refresh
        log_end_msg $?
        ;;
    reload|restart|force-reload)
        log_begin_msg "Restarting $DESC: $NAME"
        $DAEMON -c && d_stop
        d_start
        log_end_msg $?
        ;;
    status)
        d_status
	;;
    *)
        echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload|reload}" >&2
        exit 1
        ;;
esac

exit 0
