#! /bin/bash

##
# Copyright (C) 2007 Apple Inc. All rights reserved.
# 
# @APPLE_LICENSE_HEADER_START@
# 
# This file contains Original Code and/or Modifications of Original Code
# as defined in and that are subject to the Apple Public Source License
# Version 2.0 (the 'License'). You may not use this file except in
# compliance with the License. Please obtain a copy of the License at
# http://www.opensource.apple.com/apsl/ and read it before using this
# file.
# 
# The Original Code and all software distributed under the License are
# distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
# EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
# INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
# Please see the License for the specific language governing rights and
# limitations under the License.
# 
# @APPLE_LICENSE_HEADER_END@
##

LAUNCHCTL=/bin/launchctl
SERVERADMIN=/usr/sbin/serveradmin
GREP=/usr/bin/grep
PERL=/usr/bin/perl
XXD=/usr/bin/xxd
KILLALL=/usr/bin/killall

# The installer supplies $1 as the path to the package being installed, $2 as
# the path to the installation folder, $3 as the path to the mountpoint of the
# target.
PKGPATH="$1"
INSTALLPATH="$2"
TARGET="$3"

if [ "$TARGET" = "" ]; then
    echo \$TARGET must be set
    exit 1
fi

case $(/usr/bin/sw_vers -productVersion) in
    10.0|10.1|10.2|10.3|10.4) ;;
    # Silently do nothing if we are running on 10.5 or later, since we
    # migrated away from spinlocks late in the 10.4 series.
    *) exit 0 ;;
esac

if [ -x $SERVERADMIN ]; then
    # On Server, the "smb" service handles both smbd and nmbd
    SERVICES=smb
else
    # On Desktop, we need separate service name for every launchd task
    SERVICES="smbd nmbd swat"
fi

RUNNING=""

stop_service()
{
    service=$1
    if [ -x $SERVERADMIN ]; then
	$SERVERADMIN stop $service
    else
	$LAUNCHCTL stop org.samba.$service
	$LAUNCHCTL unload /System/Library/LaunchDaemons/$service.plist
    fi
}

start_service()
{
    service=$1

    if [ -x $SERVERADMIN ]; then
	$SERVERADMIN start $1
    else
	$LAUNCHCTL load /System/Library/LaunchDaemons/$service.plist
    fi
}

running_service()
{
    service=$1
    if [ -x $SERVERADMIN ]; then
	# serveradmin output for a running process is
	#	smb:state = "RUNNING"
	state=$(
	$SERVERADMIN status $1 | \
	    $PERL -ne "/$service:state = \"(.+)\"/ && print \"\$1\n\";"
	    )

	[[ "$state" = "RUNNING" ]]
    else
	# WARNING: The grep will hang unless launchctl is run as root.
	$LAUNCHCTL list | $GREP -q org.samba.$service
    fi
}

# If we are not installing to /, we don't need to suspend any services, but
# we still might have to fix up the TDB files.
if [ "$TARGET" == "/" ]; then

    for s in $SERVICES ; do
	if running_service $s ; then
	    RUNNING="$RUNNING $s"
	fi
    done

    for s in $RUNNING ; do
	stop_service $s
    done

    # Irrespective of whether the tools said they were running, we need to
    # make doubly sure that these processes are stopped.
    for pass in 1 2 ; do
	$KILLALL -TERM smbd nmbd swat
	sleep 1
    done

fi

find "$TARGET/var/db/samba" "$TARGET/var/samba" -name \*.tdb | \
	 while read tdb ; do
    echo '0000028: 0000 0000' | $XXD -r - $tdb
done

if [ "$TARGET" == "/" ]; then
    for s in $RUNNING ; do
	start_service $s
    done
fi

