#!/bin/sh

# See the README in this directory for more info on using this script
# (build.unix).  Search for SSVNC_BUILD.
#
# Notes: to customize locations, e.g. for libjpeg, set LDFLAGS_OS and/or
# CPPFLAGS_OS
#
# e.g. on Darwin we did:
#
# env LDFLAGS_OS="-L/Volumes/someplace/common/lib" CPPFLAGS_OS="-I /Volumes/someplace/common/include" ./build.unix
#


# Add useful directories to PATH:
#
PATH=$PATH:/usr/bin:/bin:/usr/local/bin:/usr/X11R6/bin:/usr/bin/X11:/usr/openwin/bin:/opt/SUNWspro/bin:/usr/sfw/bin:/usr/ccs/bin
export PATH

# Check location:
#
thisdir=`dirname "$0"`
if [ ! -d ./bin -o ! -d src/patches -o ! -f ./build.unix ]; then
	echo ""
	echo "You must run this script from: $thisdir"
	echo ""
	echo "Maybe:"
	echo ""
	echo "  cd $thisdir"
	echo "  ./build.unix"
	if [ "X$BUILD_UNIX" != "X" ]; then
		sleep 2
		exit 1
	fi
	echo ""
	sleep 1
	printf "Do you want me to run those for you?  y/[n] "
	read x
	if [ "X$x" = "Xy" ]; then
		BUILD_UNIX=1
		export BUILD_UNIX
		cd "$thisdir" || exit 1
		echo "pwd:"
		pwd
		sleep 1
		./build.unix
	fi
	
	exit $?
fi

pline() {
	echo "------------------------------------------------------------------"
}

# Try to find osname.arch
#
name=$UNAME
if [ "X$name" = "X" ]; then
	name=`uname -sm | sed -e 's/ /./g' -e 's/Linux\.i.86/Linux.i686/'`
fi
if [ "X$name" = "X" ]; then
	echo "cannot determine platform: os.arch, e.g. Linux.i686"
	echo "set \$UNAME manually and retry."
	exit 1
fi

LDD="ldd"
if [ `uname` = "Darwin" ]; then
	LDD="otool -L"
fi

# Create a tmp dir for this build:
#
tmp=./src/tmp/$name.$$
if [ "X$TMPDIR" != "X" ]; then
	tmp="$TMPDIR/$tmp"
fi
mkdir -p $tmp || exit 1

# Do ultraftp Java viewer (only):
#
if [ "X$SSVNC_BUILD_ULTRAFTP" != "X" ]; then
	ultraftp_tar=`ls -td ./src/zips/ultraftp.tar* | head -1`
	if [ ! -f $ultraftp_tar ]; then
		echo "could not locate ultraftp java vnc viewer source"
		exit 1
	fi
	echo ""
	pline
	echo "BUILDING THE ULTRAFTP HELPER JAR"
	echo ""
	sleep 1

	cat $ultraftp_tar | (cd $tmp; tar xvf -) || exit 1
	cd $tmp/ultraftp || exit 1
	pwd
	echo
	make install

	exit 0	# DONE
fi

# Work out main destination:
#
dest=./bin/$name
if [ -d $dest ]; then
	if [ "X$SSVNC_BUILD_FORCE_OVERWRITE" = "X" ]; then
		printf "$dest exists.  overwrite in it? [y]/n "
		read x
		if [ "X$x" = "Xn" ]; then
			exit
		fi
	else
		echo "$dest exists.  overwriting in it."
	fi
	if [ "X$SSVNC_BUILD_SKIP_VIEWER" = "X" ]; then
		if [ `uname` = "Darwin" ]; then
			rm -f $dest/vncviewer.x11*
		else
			rm -f $dest/vncviewer*
		fi
	fi
	if [ "X$SSVNC_BUILD_SKIP_STUNNEL" = "X" ]; then
		rm -f $dest/stunnel*
	fi
fi
mkdir -p $dest || exit 1


# Try to find some static archives of various libraries:
#
libs="$tmp/libs"
mkdir -p $libs || exit 1
for liba in libz.a libjpeg.a libssl.a libcrypto.a
do
	if [ "X$SSVNC_BUILD_STATIC" = "X" ]; then
		break
	fi
	for dir in /usr/lib /lib /usr/local/lib /usr/pkg/lib /usr/sfw/lib /usr/openwin/lib
	do
		if [ "$name" = "Linux.x86_64" -o "$name" = "Linux.ppc64" ] ; then
			dir64=`echo "$dir" | sed -e 's,lib,lib64,'`
			if [ "X$SSVNC_BUILD_NO_LINUX64" != "X" ]; then
				:
			elif [ -d $dir64 ]; then
				dir=$dir64
			fi
		fi
		try="$dir/$liba"
		if [ -f $try ]; then
			cp -p "$try" $libs
		fi
	done
done
if [ "X$SSVNC_BUILD_STATIC" != "X" ]; then
	echo "Found these static archive libraries, will try to use them..."
	ls -ld $libs
	ls -l $libs
	echo
fi

have_gcc=""
if type gcc > /dev/null; then
	have_gcc=1
fi
have_cc=""
if type cc > /dev/null; then
	have_cc=1
fi

if [ "X$have_cc" = "X" ]; then
	if [ "X$have_gcc" = "X1" ]; then
		cat > $tmp/cc <<END
#!/bin/sh
gcc "\$@"
END
		chmod 755 $tmp/cc
		PATH=$PATH:`pwd`/$tmp
		type cc
		type gcc
	fi
fi

if [ -d /var/tmp/LIBS -a "X$SSVNC_BUILD_STATIC" != "X" ]; then
	LDFLAGS_OS="$LDFLAGS_OS -L/var/tmp/LIBS"
fi

if [ `uname` = "SunOS" ]; then
	LDFLAGS_OS="$LDFLAGS_OS -L/usr/sfw/lib -R/usr/sfw/lib"
	CPPFLAGS_OS="$CPPFLAGS_OS -I /usr/sfw/include"
elif uname | grep -i bsd > /dev/null; then
	LDFLAGS_OS="$LDFLAGS_OS -L/usr/local/lib -L/usr/pkg/lib"
	CPPFLAGS_OS="$CPPFLAGS_OS -I /usr/local/include -I /usr/pkg/include"
fi

cnt=`ls ./src/patches/*.patch | wc -c`
if [ $cnt -lt 1 ]; then
	echo "Could not find any patches in ./src/patches.  Is your tarball missing them?"
	exit 1
fi

pline() {
	echo "------------------------------------------------------------------"
}

# Do tightvnc viewer:
#
if [ "X$SSVNC_BUILD_SKIP_VIEWER" = "X" ]; then
	tight_src=`ls -td ./src/vnc_unixsrc* | head -1`
	if [ ! -d $tight_src ]; then
		echo "could not locate tight vnc viewer source"
		exit 1
	fi
	echo ""
	pline
	echo "BUILDING THE VNCVIEWER"
	echo ""
	sleep 1

	cp -pR "$tight_src" "$tmp/vnc_unixsrc" || exit 1

	echo "applying tight vnc patches:"
	start=`pwd`
	cd $tmp;
	failed=0
	count=0
	patches="../../patches/tight-vncviewer-full.patch"
	if [ ! -f "$patches" ]; then
		patches=`ls ../../patches/tight* | grep -v 'tight-vncviewer-full.patch'`
	fi
	for patch in $patches
	do
		if [ ! -f "$patch" ]; then
			continue
		fi
		if [ "X$PATCH_FAIL" != "X" ]; then
			failed=1	
			break
		fi
		echo PATCHING WITH: "$patch" 
		ls -l "$patch"
		sleep 1
		patch -p0 < "$patch"
		if [ $? != 0 ]; then
			failed=`expr $failed + 1`
		else
			count=`expr $count + 1`
		fi
	done
	sleep 1
	cd "$start"
	if [ $failed != 0 -o $count = 0 ]; then
		ball=src/zips/vnc_unixsrc_vncviewer.patched.tar
		echo "patches failed, trying to use backup tarball:"
		ls -l $ball
		sleep 2
		cat $ball | (cd $tmp; tar -xvf -)
	fi
	echo


	cd $tmp/vnc_unixsrc
	xmkmf
	make Makefiles
	mv vncviewer/Makefile vncviewer/Makefile.orig
	sed -e "s,EXTRA_LDOPTIONS =,EXTRA_LDOPTIONS = -L$start/$libs $LDFLAGS_OS," \
	    -e "s,CCOPTIONS =,CCOPTIONS = $CPPFLAGS_OS," \
		vncviewer/Makefile.orig > vncviewer/Makefile

	if [ `uname` = "SunOS" ]; then
		for d in vncviewer libvncauth vncconnect vncpasswd
		do
			mv $d/Makefile $d/Makefile.orig
			sed -e "s,CCOPTIONS =.*\$,CCOPTIONS = $CPPFLAGS_OS," \
				$d/Makefile.orig > $d/Makefile
		done
	fi

	make depend
	echo $PATH
	make all
	ls -l vncviewer/vncviewer
	cd "$start"
	src=$tmp/vnc_unixsrc/vncviewer/vncviewer
	sync
	sleep 2
	sync
	strip $src
	sync
	sleep 2
	sync
	wc  $src
	sum $src
	sleep 2

	suff=""
	if [ `uname` = "Darwin" ]; then
		suff=".x11"
	fi
	echo cp -p $src $dest/vncviewer$suff
	sleep 1
	cp -p $src $dest/vncviewer$suff || exit 1

	echo
	pline
	echo "LISTING, HELP, and LDD THE VNCVIEWER:" 
	echo
	sleep 1

	ls -l $src $dest/vncviewer$suff
	echo
	echo $dest/vncviewer$suff -h
	echo
	$dest/vncviewer$suff -h
	echo
	echo $LDD $dest/vncviewer$suff
	echo
	$LDD $dest/vncviewer$suff
	echo ""
fi

# Do stunnel:
#
if [ "X$SSVNC_BUILD_SKIP_STUNNEL" = "X" ]; then
	stunnel_src=`ls -td ./src/stunnel* | head -1`
	if [ ! -d $stunnel_src ]; then
		echo "could not locate stunnel source"
		exit 1
	fi
	echo ""
	pline
	echo "BUILDING THE STUNNEL"
	echo ""
	sleep 1

	cp -pR "$stunnel_src" "$tmp/stunnel" || exit 1

	echo "applying stunnel patches:"
	start=`pwd`
	cd $tmp;
	failed=0
	count=0
	for patch in ../../patches/stunnel*
	do
		if [ ! -f "$patch" ]; then
			continue
		fi
		if [ "X$PATCH_FAIL" != "X" ]; then
			failed=1	
			break
		fi
		echo PATCHING WITH: "$patch" 
		ls -l "$patch"
		sleep 1
		patch -p0 < $patch
		if [ $? != 0 ]; then
			failed=`expr $failed + 1`
		else
			count=`expr $count + 1`
		fi
	done
	sleep 1
	cd "$start"
	if [ $failed != 0 -o $count = 0 ]; then
		ball=src/zips/stunnel.patched.tar
		echo "patches failed, trying to use backup tarball:"
		ls -l $ball
		sleep 2
		cat $ball | (cd $tmp; tar -xvf -)
	fi
	echo


	cd $tmp/stunnel
	if [ `uname` = "SunOS" ]; then
		cp configure configure.orig
		sed -e "s,/var/ssl,/var/ssl /usr/sfw," configure.orig > configure
	fi
	env LDFLAGS="-L$start/$libs $LDFLAGS_OS" CPPFLAGS="$CPPFLAGS_OS" ./configure --disable-libwrap
	make
	ls -l src/stunnel
	cd "$start"
	src=$tmp/stunnel/src/stunnel
	sync
	sleep 2
	sync
	strip $src
	sync
	sleep 2
	sync
	wc  $src
	sum $src
	sleep 2
	echo cp -p $src $dest/stunnel
	cp -p $src $dest/stunnel || exit 1
	sleep 1
	cp -p $src $dest/stunnel || exit 1

	echo
	pline
	echo "LISTING, HELP, and LDD THE STUNNEL:" 
	echo
	sleep 1

	ls -l $src $dest/stunnel
	echo
	echo $dest/stunnel -help
	echo
	$dest/stunnel -help
	echo
	echo $LDD $dest/stunnel
	echo
	$LDD $dest/stunnel
	echo ""
fi

# Do vncstorepw and ld preload friends:
#
if [ "X$SSVNC_BUILD_SKIP_VNCSTOREPW" = "X" ]; then
	vncpw_tar=`ls -td ./src/zips/vncstorepw* | head -1`
	if [ ! -f $vncpw_tar ]; then
		echo "could not locate vncstorepw source"
		exit 1
	fi
	echo ""
	pline
	echo "BUILDING THE VNCSTOREPW AND FRIENDS"
	echo ""
	sleep 1

	cat "$vncpw_tar" | (cd $tmp; tar xvf -)

	cd $tmp/vncstorepw
	make

	cd "$start"
	cp -p $tmp/vncstorepw/vncstorepw $tmp/vncstorepw/lim_accept.so $dest
	echo ""

	cd $tmp/vncstorepw
	make clean

	env LD_SSL="-L$start/$libs $LDFLAGS_OS" CPP_SSL="$CPPFLAGS_OS" make ultravnc_dsm_helper

	cd "$start"
	cp -p $tmp/vncstorepw/ultravnc_dsm_helper $dest
	echo ""
fi


if [ "X$SSVNC_BUILD_SKIP_VIEWER" = "X" -a "X$SSVNC_BUILD_SKIP_STUNNEL" = "X" ]; then
	# list the viewer again.

	echo
	pline
	echo "LISTING, HELP, and LDD THE VNCVIEWER (again):" 
	echo
	sleep 1

	ls -l $dest/vncviewer$suff
	echo
	echo $dest/vncviewer$suff -h
	echo
	$dest/vncviewer$suff -h
	echo
	echo $LDD $dest/vncviewer$suff
	echo
	$LDD $dest/vncviewer$suff
fi