#! /bin/sh
### BEGIN INIT INFO
# Provides:             krb5-kdc
# Required-Start:       $local_fs $remote_fs $network $syslog
# Required-Stop:        $local_fs $remote_fs $network $syslog
# X-Start-Before: $x-display-manager
# Default-Start:        2 3 4 5
# Default-Stop:         0 1 6
# Short-Description:    MIT Kerberos KDC
# Description:          Starts, stops, or restarts the MIT Kerberos KDC.  This
#                       daemon responds to ticket requests from Kerberos
#                       clients.
### END INIT INFO

# Author: Sam Hartman <hartmans@mit.edu>
# Author: Russ Allbery <rra@debian.org>
#
# Based on the /etc/init.d/skeleton template as found in initscripts version
# 2.86.ds1-15.

# June, 2012: Adopted for yocto <amy.fong@windriver.com>

PATH=/usr/sbin:/usr/bin:/sbin:/bin
DESC="Kerberos KDC"
NAME=krb5kdc
DAEMON=/usr/sbin/$NAME
DAEMON_ARGS=""
SCRIPTNAME=/etc/init.d/krb5-kdc

# Exit if the package is not installed.
[ -x "$DAEMON" ] || exit 0

# Read configuration if it is present.
[ -r /etc/default/krb5-kdc ] && . /etc/default/krb5-kdc

# Get the setting of VERBOSE and other rcS variables.
[ -f /etc/default/rcS ] && . /etc/default/rcS

. /etc/init.d/functions

# Return
#   0 if daemon has been started
#   1 if daemon was already running
#   2 if daemon could not be started
do_start_kdc()
{
    start-stop-daemon --start --quiet --startas $DAEMON --name $NAME --test \
        > /dev/null || return 1
    start-stop-daemon --start --quiet --startas $DAEMON --name $NAME \
        -- $DAEMON_ARGS || return 2
}


# Return
#   0 if daemon has been stopped
#   1 if daemon was already stopped
#   2 if daemon could not be stopped
#   other if a failure occurred
do_stop_kdc()
{
    start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --name $NAME
    RETVAL="$?"
    [ "$RETVAL" = 2 ] && return 2
    return "$RETVAL"
}


case "$1" in
  start)
    [ "$VERBOSE" != no ] && echo "Starting $DESC" "$NAME"
    do_start_kdc
    case "$?" in
      0|1)
            [ "$VERBOSE" != no ] && echo 0
        ;;
      2)
        [ "$VERBOSE" != no ] && echo 1
        ;;
    esac
    ;;

  stop)
    [ "$VERBOSE" != no ] && echo "Stopping $DESC" "$NAME"
    do_stop_kdc
    case "$?" in
      0|1)
        [ "$VERBOSE" != no ] && echo "krb524d"
        ;;
      2)
        [ "$VERBOSE" != no ] && echo 1
        ;;
    esac
    ;;

  restart|force-reload)
    echo "Restarting $DESC" "$NAME"
    do_stop_kdc
    case "$?" in
      0|1)
        do_start_kdc
        case "$?" in
          0)
	  echo 0
	  ;;
          1|2)
            echo 1
            ;;
        esac
        ;;
      *)
        echo 1
        ;;
    esac
    ;;

  status)
    pidofproc "$DAEMON" >/dev/null
    status=$?
    if [ $status -eq 0 ]; then
        echo "$NAME is running."
    else
        echo "$NAME is not running."
    fi
    exit $status
    ;;

  *)
    echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload|status}" >&2
    exit 3
    ;;
esac

:
