#!/bin/sh
# (c) Copyright 1994 James H. Lowe, Jr.
#$Id: shak_rbk_v 1.36 1997/01/18 17:40:38 jhl Exp $
#

returnvalue () {
     return $1
}

MAX_SHAK_ENV=950
envtrunc="0"
ENVIR=""
PATH="$SHAK_clientpath"
export PATH
shak_rsh_is_sh="0"
shak_ampersand=""
total=1

if [ "$shak_async" = "1" ]; then
	shak_ampersand="&"
fi

TMPFILE="${shak_tmpbasename}.shak_rbk$$"
TMPFILEENV="${shak_tmpbasename}.shak_rbkenv$$"

if [ "$shak_debug" = "2" ]; then
  set -vx
  env 1>&2
fi

if [ -f /bin/hostname ]; then
   B="`/bin/hostname | sed -e 's/^\([^\.]*\)\..*/\1/'`"
else
   B="`hostname | sed -e 's/^\([^\.]*\)\..*/\1/'`"
fi

cmdhost="`echo $SHAK_BACKHOST | sed -e 's/^\([^\.]*\)\..*/\1/'`"
if [ "$cmdhost" = "$B" -o "$cmdhost" = "localhost" ]; then
#
#  Local host backup Execution.
#
	if [ ! "$shak_stderrfile" ]; then	
		if [ "$shak_async" = "1" ]; then
             		sickdelay=$delay_userbackup  ${SHAK_LIBPATH}/shak_dog "$@" &
		else
             		sickdelay=$delay_userbackup  ${SHAK_LIBPATH}/shak_dog "$@"
		fi
		retval=$?
	else
		umask 077
		> $shak_stderrfile
		cat $shak_stderrfile
		if [ $? -eq 0 ]; then
			if [ "$shak_async" = "1" ]; then
				if [ $shak_errmon = 1 ]; then	
					if [ "$SHAK_usersecure" = noyes ]; then
						echo "shak_rbk: invalid user input." 1>&2
						exit 3
					else
             					${SHAK_LIBPATH}/shak_exec "$@" 2>>$shak_stderrfile &
						cmdpid="$!"
						${SHAK_LIBPATH}/shak_errmon "$cmdpid" "$shak_stderrfile" "$*" 1>/dev/null
						retval=$?
						case $shak_stderrfile in
							/usr/tmp/*)
									# avoid? a race with shak_errmon
									( sleep 10 && /bin/rm -f "$shak_stderrfile" ) &
									;;
						esac
						returnvalue $retval
					fi
				else
             				sickdelay=$delay_userbackup  ${SHAK_LIBPATH}/shak_dog "$@" 2>>$shak_stderrfile & 
				fi
			else
             			sickdelay=$delay_userbackup  ${SHAK_LIBPATH}/shak_dog "$@" 2>>$shak_stderrfile
			fi
			retval=$?
		else
			echo "shak_rbk: stderror file $shak_stderrfile : creation failure." 1>&2
			retval=$?
	                /bin/rm -f $TMPFILEENV
	                /bin/rm -f $TMPFILE
			exit 1
		fi
	fi
else
#
#  Remote host backup execution.
#
	if [ "$shak_rsh_is_sh" = "1" ]; then
	        /bin/rm -f $TMPFILEENV
	        /bin/rm -f $TMPFILE
		exit 4
#		if remote shell  (shell on far machine) is sh-like then something special
#		can be done maybe, but I can't think of anything.
	else

	umask 077
	>$TMPFILE
	>$TMPFILEENV
	env >$TMPFILEENV

catvar () {
	varname=$1
	tmpfileenv=$2
	tmpfile=$3
	total1=$4

	line="`egrep "^$varname" <$tmpfileenv | tail -1`"
        if [ "$line" ]; then	
	   linesize="`echo "$line" | wc -c`"
	   totalf="`expr $total1 + $linesize`"

	   if [ $totalf -ge $MAX_SHAK_ENV ]; then
		echo "shak_rbk: error: env too large: $totalf chars at $varname" 1>&2
		echo 0
		exit 1;
	   fi
	   echo "$line" | sed -e 's/\$/\\\$/g' -e 's/^/\"/' -e 's/$/\"/' >>$tmpfile
	   echo $totalf
	   exit 0
        else
	   echo $total1
	   exit 0
        fi
}

foo1 () {
	varname=$1
	tmpfileenv=$2
	tmpfile=$3
	total1=$4
	
	egrep "^$varname" <$tmpfileenv |
	while read line; 
	do 
        if [ "$line" ]; then 
	   linesize="`echo "$line" | wc -c`" 
	   total1="`expr $total1 + $linesize`"
	   if [ $total1 -ge $MAX_SHAK_ENV ]; then 
		echo "shak_rbk: foo1: error: env too large: $total1 after $line" 1>&2
	        echo 0
		exit 1
	   fi
	   echo "$line" | sed -e 's/\$/\\\$/g' -e 's/^/\"/' -e 's/$/\"/' >>$tmpfile
	   echo $total1
        else
	   echo $total1
	   exit 0
        fi
        done | tail -1
        exit 0
}

catuservar () {
	varname=$1
	tmpfileenv=$2
	tmpfile=$3
	total1=$4

        tot="`foo1 $varname $tmpfileenv $tmpfile $total1`"
        if [ $tot -eq 0 ]; then
	   retval=1
	else
	   retval=0
        fi
	echo $tot
        exit $retval
}

	for var in SHAK_SHAKHEADER SHAK_TAPEDEVICE SHAK_TAPEHOST PATH
	  do
		total="`catvar $var $TMPFILEENV $TMPFILE $total`"
		if [ $total -ge $MAX_SHAK_ENV -o $total -eq 0 ]; then
			envtrunc="1"
			break;
		fi
	  done


#############################################
     if [ "$shak_userenv" = "0" ]; then

       if [ $envtrunc -eq 0 ]; then
	  for var in SHAK_SHAKDATE SHAK_TIME_T SHAK_SHAKTYPE SHAK_TAPENUMBER
	    do
		total="`catvar $var $TMPFILEENV $TMPFILE $total`"
		if [ $total -ge $MAX_SHAK_ENV -o $total -eq 0 ]; then
			envtrunc="2"
			break;
		fi
	    done
       fi


       if [ $envtrunc -eq 0 ]; then
	  for var in SHAK_LOGPATH SHAK_LOGHOST SHAK_LOGBASENAME SHAK_LOGNAME SHAK_USERPATH \
	             SHAK_DOMAIN SHAK_BACKHOST SHAK_INDEXHOST
	    do
		total="`catvar $var $TMPFILEENV $TMPFILE $total`"
		if [ $total -ge $MAX_SHAK_ENV -o $total -eq 0 ]; then
			envtrunc="3"
			break;
		fi
	    done
       fi

       if [ $envtrunc -eq 0 ]; then
	for var in SHAK_USER
	    do
		total="`catuservar SHAK_USER\?\?\? $TMPFILEENV $TMPFILE $total`"
		if [ $total -ge $MAX_SHAK_ENV -o $total -eq 0 ]; then
			envtrunc="3"
			break;
		fi
	    done
       fi

       if [ $envtrunc -eq 0 ]; then
	  for var in SHAK_INDEXPATH SHAK_LIBPATH SHAK_DEFAULTTEST SHAK_REMSH SHAK_OVERWRITE
	    do
		total="`catvar $var $TMPFILEENV $TMPFILE $total`"
		if [ $total -ge $MAX_SHAK_ENV -o $total -eq 0 ]; then
			envtrunc="4"
			break;
		fi
	    done
       fi
       
       if [ $envtrunc -eq 0 ]; then
	  for var in TZ NLSPATH
	    do
		total="`catvar $var $TMPFILEENV $TMPFILE $total`"
		if [ $total -ge $MAX_SHAK_ENV -o $total -eq 0 ]; then
			envtrunc="5"
			break;
		fi
	    done
       fi
	
     else
#### if shak_userenv is non-zero
     
	  for var in SHAK_USER
	    do
		total="`catuservar SHAK_USER\?\?\? $TMPFILEENV $TMPFILE $total`"
		if [ $total -ge $MAX_SHAK_ENV -o $total -eq 0 ]; then
			envtrunc="1"
			break;
		fi
	    done
	
     fi

# Here we must evaluate the truncation catagory according
# to the values of envtrunc and take appropriate action.
	if [ $shak_trunclevel -ge 6 ]; then
		shak_trunclevel="5"
	fi

	tlevel="` expr 5 - $shak_trunclevel `" 

	case $envtrunc in

	    0)
#		always acceptable
	    	:
		;;
	    *)
		if [ $envtrunc  -gt $tlevel ]; then
  		:
		else
			echo "shak_rbk: fatal: environment truncated on level $envtrunc" 1>&2
			echo "shak_rbk: tolerance level: $shak_trunclevel" 1>&2
	                /bin/rm -f $TMPFILEENV
	                /bin/rm -f $TMPFILE
			exit 2
		fi
		;;	
	esac
	
	size="`wc -c <$TMPFILE`"
	size1="`echo -n "env  -  "$@"" | wc -c `"
 	size="`expr $size + $size1 `"	
	if [ $size -ge 1023 ]; then
		echo "shak_rbk: fatal error: command string longer than 1023 chars." 1>&2
	        /bin/rm -f $TMPFILEENV
	        /bin/rm -f $TMPFILE
		exit 3;
	fi
	
	if [ ! "$shak_stderrfile" ]; then	
		if [ "$shak_async" = "1" ]; then
			${SHAK_LIBPATH}/shak_remsh ${SHAK_REMSH} ${SHAK_BACKHOST} env - `cat $TMPFILE` "$@" &
		else
			sickdelay=$delay_userbackup ${SHAK_LIBPATH}/shak_remsh ${SHAK_REMSH} ${SHAK_BACKHOST} env - `cat $TMPFILE` "$@"
		fi
	else
		umask 077
		> $shak_stderrfile
		cat $shak_stderrfile
		if [ $? -eq 0 ]; then
			if [ "$shak_async" = "1" ]; then
				if [ $shak_errmon = 1 ]; then	
					if [ "$SHAK_usersecure" = noyes ]; then
						echo "shak_rbk: invalid user input." 1>&2
						exit 3
					else
             					sickdelay=0 ${SHAK_LIBPATH}/shak_exec ${SHAK_LIBPATH}/shak_remsh ${SHAK_REMSH} ${SHAK_BACKHOST} env - `cat $TMPFILE` "$@" 2>>$shak_stderrfile &
						cmdpid="$!"
						${SHAK_LIBPATH}/shak_errmon "$cmdpid" "$shak_stderrfile" "$*" 1>/dev/null
						retval=$?
						case $shak_stderrfile in
							/usr/tmp/*)
									# avoid? a race with shak_errmon
									( sleep 10 && /bin/rm -f "$shak_stderrfile" ) &
									;;
						esac
						returnvalue $retval
					fi
				else
					${SHAK_LIBPATH}/shak_remsh ${SHAK_REMSH} ${SHAK_BACKHOST} env - `cat $TMPFILE` "$@" 2>>$shak_stderrfile &
				fi
			else
				sickdelay=$delay_userbackup ${SHAK_LIBPATH}/shak_remsh ${SHAK_REMSH} ${SHAK_BACKHOST} env - `cat $TMPFILE` "$@" 2>>$shak_stderrfile
			fi
		else
			echo "shak_rbk: stderror file $shak_stderrfile : creation failure." 1>&2
	                /bin/rm -f $TMPFILEENV
	                /bin/rm -f $TMPFILE
			exit 1
		fi
	fi
	retval=$?
	/bin/rm -f $TMPFILEENV
	/bin/rm -f $TMPFILE
#	########################################
	fi
fi
exit $retval


