#!/usr/bin/env bash

# Copyright 2010 The Go Authors.  All rights reserved.
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file.

# This is a small script for executing go binaries on the android platform.
#
# example:
# ./a 5.out foo bar baz
#
# The script exports the local values of GOARCH, GOTRACEBACK and GOGC
# to the android environment.
#
# Known issues:
# The script fails unless the last character output by the program is "\n"
#
# TODO(kaib): add gdb bridge support

exp ()
{
	if [ ${!1} ]; then
		echo "export $1=\"${!1}\"; "
	fi
}

# adb does not correctly return the exit value of the executed program. use this
# wrapper to manually extract the exit value
rloc=/data/local/tmp/retval
rsize=$(adb shell "ls -l $rloc"|tr -s ' '|cut -d' ' -f4)
rcheck=38
if [ "$rsize" != "$rcheck" ]; then
#	echo "debug: retval size incorrect want $rcheck, got $rsize. uploading"
	echo  >/tmp/adb.retval '#!/system/bin/sh
"$@"
echo RETVAL: $?' 
	adb push /tmp/adb.retval $rloc >/dev/null 2>&1
	adb shell chmod 755 $rloc
fi

# run the main binary
if [ "-g" == "$1" ]; then
	adb forward tcp:$2 tcp:$2
	args=$(echo $*| cut -d' ' -f4-)
	adb push $3 /data/local/tmp/$3 >/dev/null 2>&1
	adb shell "$(exp GOARCH) $(exp GOTRACEBACK) $(exp GOGC) \
		gdbserver :$2 /data/local/tmp/retval /data/local/tmp/$3 $args" \
		2>&1|tr -d '\r' |tee /tmp/adb.out|grep -v RETVAL
else
	if [ "$*" != "$1" ]; then
		args=$(echo $*| cut -d' ' -f2-)
	fi
	adb push $1 /data/local/tmp/$1 >/dev/null 2>&1
	adb shell "$(exp GOARCH) $(exp GOTRACEBACK) $(exp GOGC) \
		/data/local/tmp/retval /data/local/tmp/$1 $args" \
		2>&1|tr -d '\r' |tee /tmp/adb.out|grep -v RETVAL
fi
exit $(grep RETVAL /tmp/adb.out|tr -d '\n\r'| cut -d' ' -f2)
