#!/bin/sh
#
# Shell file to XFBB software
#
# F6FBB 1998
#
# Base directory of XFBB software
#
VERSION=7.04

CONFDIR=$DESTDIR/etc/ax25/fbb
DATADIR=$DESTDIR/var/ax25/fbb
FBBDIR=$DESTDIR/var/ax25/fbb
LIBDIR=$DESTDIR/usr/lib/fbb
SBINDIR=$DESTDIR/usr/sbin

DOSDIR=$DATADIR/fbbdos
MAILIN=$FBBDIR/mail/mail.in
FBB=$SBINDIR/xfbbd

FBBLOG=/var/ax25/fbb/log/xfbb.log

#
# Do not change following lines
#

# Export resource file
XAPPLRESDIR=$DATADIR/Icons

export CONFDIR DATADIR FBBDIR LIBDIR SBINDIR DOSDIR MAILIN FBB FBBLOG XAPPLRESDIR

# run batches from the housekeeping directory
housekeeping()
{
	echo "Running $1"
	if [ -d $LIBDIR/script/$1 ] ; then
		for i in $LIBDIR/script/$1/*; do
    		test -x "$i" || continue
			echo "  script = $i"
			$i
		done
	fi
}

check_dir()
{
	if [ ! -d $1 ] ; then
		echo
		echo "Error : directory $1 does not exist."
		echo "FBB software was not correctly installed or configured"
		echo "Giving up !"
		exit 1;
	fi
}

fbb_tree()
{
	echo -n "Checking fbb tree."

	check_dir $CONFDIR
	check_dir $CONFDIR/lang
	echo -n "."

	check_dir $DATADIR
	check_dir $DATADIR/mail
	for n in 0 1 2 3 4 5 6 7 8 9 ; do
		check_dir $DATADIR/mail/mail$n
	done
	echo -n "."

	check_dir $DATADIR/binmail
	for n in 0 1 2 3 4 5 6 7 8 9 ; do
		check_dir $DATADIR/binmail/mail$n
	done
	echo -n "."

	check_dir $DATADIR/oldmail
	check_dir $DATADIR/Icons
	check_dir $DATADIR/docs
	check_dir $DATADIR/log
	check_dir $DATADIR/sat
	check_dir $DATADIR/wp
	check_dir $DOSDIR
	check_dir $DOSDIR/yapp
	check_dir $LIBDIR/pg
	check_dir $LIBDIR/filter
	check_dir $LIBDIR/server
	check_dir $LIBDIR/script
	check_dir $LIBDIR/tool
	
	echo " Ok"
}


fbb_end()
{
	echo "Received TERM signal"
	echo "killproc -TERM $FBB"
	killproc -TERM $FBB
	exit 1
}

fbb_return()
{
	echo
	
	case $1 in
	1)	# SIGTERM received
		housekeeping end_session
		exit 0
		;;
	2)	# /L and /M sysop commands
		housekeeping rerun
		;;
	3)	# /K sysop command and normal housekeeping
		housekeeping maintenance
		;;
	4)	# /A sysop command
		housekeeping stop_system
		exit 0
		;;
	5)	# "Segmentation violation" or "bus error"
		housekeeping sig_segv
		;;
	6)	# /R sysop command
		housekeeping reset
		exit 0
		;;
	*)	echo "Unknown return value $1"
		housekeeping error_return $ret
		;;
	esac
}

fbb_loop()
{
	PATH=$PATH:$LIBDIR/tool:$SBINDIR
	export PATH
	trap fbb_end TERM

	while true ; do

		cd $FBBDIR

		$FBB $FBB_PARAM &
		wait $!

		fbb_return $?

	done
}

fbb_run()
{
	echo
	echo -n "FBB options :"
	if [ -n "$FBB_PARAM" ] ; then
		echo "$FBB_PARAM"
	else
		echo " (none)"
	fi
	
	if [ $FBB_FG -eq 1 ] ; then
		echo "Running XFBB under Xwindows  ^C to abort"
		sleep 1
		echo "Starting XFBB (pwd = `pwd`)..."
	        FBB=$SBINDIR/xfbb
		export FBB
		fbb_loop > $FBBLOG 2>&1
	else
		echo "Running XFBB in background mode ^C to abort"
		sleep 1
	        FBB=$SBINDIR/xfbbd
		FBB_BACKGROUND=1
		export FBB_BACKGROUND FBB
		echo "Starting XFBB (pwd = `pwd`)..."
		(cd $LOCALDIR ; $MY_SHELL $FBB_PARAM > $FBBLOG 2>&1 & )
		exit 0
	fi
}

fbb_help()
{
	echo "format : fbb [-f] [-h] [-s] [-l log_file]"
	echo "-f : run fbb in foreground under Xwindows"
	echo "-h : this help information"
	echo "-l : log debug info to log_file"
	echo "-s : run fbb silently"
	
	exit 0
}

fbb_opt()
{
	MY_SHELL=$0
	FBB_FG=0
	RUN_BG=0
	FBB_SILENT=0

	while [ $# -gt 0 ]; do
		case "$1" in
		-h)
			fbb_help
			;;
		-f) 
			FBB_FG=1 
			;;
		-s) 
			FBB_SILENT=1 
			;;
		-l) 
			FBBLOG=$2
			shift
			;;
		*)
			FBB_PARAM="$FBB_PARAM $1"
			;;
		esac
		shift
	done

	if [ -n "$FBB_BACKGROUND" ] ; then
		fbb_loop
		exit 0
	fi
}

LOCALDIR=`pwd`

fbb_opt $*
if [ $FBB_SILENT -eq 1 ] ; then
	fbb_tree > /dev/null 2>&1
	fbb_conf > /dev/null 2>&1
	fbb_run  > /dev/null 2>&1
else
	fbb_tree
	fbb_run
fi

exit 0
