## The system's main boot script.

##
## Some functions used by the main script
##

# launch <executable path> [ <thread to wait for> [ <program args> ] ]

launch() {
	toLaunch="$1"
	shift
	toWaitFor="$1"
	(( $# )) && shift
	if [ -f "/boot/$toLaunch" ]
	then
		"/boot/$toLaunch" $* &
		[ "$toWaitFor" != "" ] && waitfor "$toWaitFor"
		return 1
	else
		echo There is no "$toLaunch"
	fi
	return 0
}

# launchscript <script path>

launchscript() {
	if [ -f "/boot/$1" ]
	then
		. "/boot/$1"
	fi
}

# runprog <executable path>

runprog() {
	if [ -f "/boot/$1" ]
	then
		"/boot/$1"
		return 1
	else
		echo There is no "$1"
	fi
	return 0
}

##
## Main script starts here
##

# Set up stdin/out/err to nirvana

exec </dev/null
exec >/dev/null 2>&1

# Standard locations of boot files
SCRIPTS=system/boot
SERVERS=system/servers

# clean the shared memory dir
shmDir=/var/shared_memory
rm -rf $shmDir
mkdir -p $shmDir
chmod 777 $shmDir

# Set up the environment

export SAFEMODE=`/bin/safemode`

launchscript $SCRIPTS/SetupEnvironment

# If the boot volume is a CD we use another script
isReadOnly=`/bin/isvolume -readonly-partition /boot`
if [ "$isReadOnly" = "yes" ]; then
	# block the CD tray (avoid accidental ejection)
	# This option stays 'on' even if we continue booting to the desktop.
	/bin/eject -b /boot
else
	# Sets timezone etc.
	runprog system/bin/clockconfig
fi

# Create /tmp dir, and make sure it's empty

TMPDIR=/boot/common/cache/tmp
if [ ! -d $TMPDIR ]; then
	mkdir -f $TMPDIR
	chmod a+rwx $TMPDIR
else
	rm -rf $TMPDIR/*
fi


# Launch servers

# We must wait for the app_server and registrar to be ready
launch $SERVERS/registrar _roster_thread_	# launch registrar

launch $SERVERS/debug_server				# launch debug_server

# Init Network
if [ "$SAFEMODE" != "yes" ]; then
	launch $SERVERS/net_server				# launch net_server
fi

launch $SERVERS/app_server picasso		# launch app_server

if [ "$SAFEMODE" != "yes" ]; then
	launch $SERVERS/syslog_daemon
	waitfor _input_server_event_loop_		# wait for input devices
fi

# Now ask the user if he wants to run the Installer or continue to the Desktop.
if [ "$isReadOnly" = "yes" ]; then
	# Create Installer link (using the write overlay)
	ln -sf /boot/system/apps/Installer /boot/home/Desktop/Installer

	/bin/ReadOnlyBootPrompt
	if [ $? -eq 0 ]; then
		launchscript $SCRIPTS/Bootscript.cd
		exit 0 # and return
	fi
fi


if [ -e /etc/users ]; then
	# TODO: system/Login needs to be fixed to launch the mount_server!
	launch system/Login
	# nothing more
else
	cd /boot/home

	launch $SERVERS/mount_server
	waitfor -m application/x-vnd.Haiku-mount_server
	# delay the boot script until all previous volumes have been mounted
	hey -s mount_server DO InitialScan

	launch system/Tracker
	launch system/Deskbar
fi

if [ "$SAFEMODE" != "yes" ]; then
	launch $SERVERS/media_server
	launch $SERVERS/midi_server
fi

# Launch Print Server
if [ "$SAFEMODE" != "yes" ]; then
	launch $SERVERS/print_server
fi

# Launch Mail Daemon (if enabled on startup)
if [ "$SAFEMODE" != "yes" ]; then
	launch $SERVERS/mail_daemon "" -E
fi

# Launch CDDB Daemon
if [ "$SAFEMODE" != "yes" ]; then
	launch $SERVERS/cddb_daemon ""
fi

# Launch Notification Server
if [ "$SAFEMODE" != "yes" ]; then
	launch $SERVERS/notification_server ""
fi

# Launch Power Daemon
if [ "$SAFEMODE" != "yes" ]; then
	launch $SERVERS/power_daemon ""
fi

# Check for daylight saving time
launch system/bin/dstcheck

# Synchronize network time
launch system/preferences/Time "" --update

if [ "$SAFEMODE" != "yes" ]; then
	# Start user boot script
	if [ -f $HOME/config/boot/UserBootscript ]; then
		. $HOME/config/boot/UserBootscript
	fi
fi

# Check for fresh install and run post install scripts.
postInstallDir=/boot/common/boot/post_install
freshInstallIndicator=/boot/common/settings/fresh_install
if [ -e $freshInstallIndicator ]; then
	# wait a moment for things to calm down a bit
	sleep 3

	# execute scripts
	for f in $postInstallDir/*.sh; do
		if [ -f $f ]; then
			echo "Running post install script $f ..." > /dev/dprintf
			$f
		fi
	done

	sync
	rm $freshInstallIndicator
fi
