########################################################################
#                                                                      #
#               This software is part of the ast package               #
#          Copyright (c) 1994-2011 AT&T Intellectual Property          #
#          Copyright (c) 2020-2022 Contributors to ksh 93u+m           #
#                      and is licensed under the                       #
#                 Eclipse Public License, Version 2.0                  #
#                                                                      #
#                A copy of the License is available at                 #
#      https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html      #
#         (with md5 checksum 84283fa8859daf213bdda5a9f8d1be1d)         #
#                                                                      #
#                 Glenn Fowler <gsf@research.att.com>                  #
#                  Martijn Dekker <martijn@inlv.org>                   #
#                                                                      #
########################################################################
: cross compiler a.out execution

(command set -o posix) 2>/dev/null && set -o posix

command=crossexec

tmp=/tmp/cross$$

case `(getopts '[-][123:xyz]' opt --xyz; echo 0$opt) 2>/dev/null` in
0123)	ARGV0="-a $command"
	USAGE=$'
[-?
@(#)$Id: crossexec (AT&T Labs Research) 2004-01-04 $
]
[-author?Glenn Fowler <gsf@research.att.com>]
[-copyright?Copyright (c) 1994-2012 AT&T Intellectual Property]
[-license?https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html]
[+NAME?crossexec - cross compiler a.out execution]
[+DESCRIPTION?\bcrossexec\b runs a cross-compiled \acommand\a in an environment
	that supports a cross-compilation architecture different from the
	current host. The cross environment is determined by \acrosstype\a,
	usually a host type name produced by \bpackage\b(1). \acrosstype\a
	is used to find an entry in \b$HOME/.crossexec\b that specifies
	the cross compiler host and access details.]
[+?The exit status of \bcrossexec\b is the exit status of \acommand\a.]
[+CROSS ENVIRONMENT FILE?\b$HOME/.crossexec\b contains one line for each
	supported \acrosstype\a. Each line contains 5 tab separated fields.
	Field default values are specified as \b-\b. The fields are:]{
	[+crosstype?The host type produced by \bpackage\b(1).]
	[+host?The host name.]
	[+user?The user name on \ahost\a. The default is the current user.]
	[+dir?The directory to copy \acommand\a and execute it. The default
		is the \auser\a \b$HOME\b on \ahost\a.]
	[+shell?The command used to get shell access to \ahost\a. Currently
		only \brsh\b and \bssh\b are supported.]
	[+copy?The command used to copy \acommand\a to \ahost\a. Currently
		only \brcp\b and \bscp\b are supported.]
}
[n:show?Show the underlying commands but do not execute.]

crosstype command [ option ... ] [ file ... ]

[+SEE ALSO?\brcp\b(1), \brsh\b(1), \bscp\b(1), \bssh\b(1)]
'
	;;
*)	ARGV0=""
	USAGE="crosstype command [ option ... ] [ file ... ]"
	;;
esac

usage()
{
	OPTIND=0
	getopts $ARGV0 "$USAGE" OPT '-?'
	exit 2
}

exec=

# get the options and operands

while	getopts $ARGV0 "$USAGE" OPT
do	case $OPT in
	n)	exec=echo ;;
	*)	usage ;;
	esac
done
shift $OPTIND-1
case $# in
[01])	usage ;;
esac

type=$1
shift
cmd=$1
shift

# get the host info

info=$HOME/.$command
if	test ! -r $info
then	echo "$command: $info: not found" >&2
	exit 1
fi
ifs=${IFS-'
	 '}
while	:
do	IFS='	'
	read hosttype hostname usr dir sh cp
	code=$?
	IFS=$ifs
	case $code in
	0)	;;
	*)	echo "$command: $type: unknown cross compiler host type" >&2
		exit 1
		;;
	esac
	case $hosttype in
	$type)	break ;;
	esac
done < $info

# fill in the defaults

case $usr in
-)	cpu= shu= ;;
*)	cpu=${usr}@ shu="-l $usr" ;;
esac
case $dir in
-)	dir= ;;
esac
case $sh in
''|-)	sh=ssh ;;
esac
case $cp in
''|-)	cp=scp ;;
scp)	cp="$cp -q" ;;
esac

trap "rm -f $tmp" 0 1 2 3 15
$exec $cp $cmd $cpu$hostname:$dir </dev/null || exit 1
cmd=./${cmd##*/}
$exec $sh $shu $hostname "cd $dir; LD_LIBRARY_PATH=: $cmd $@ </dev/null 2>/dev/null; code=\$?; rm -f $cmd; echo $command: exit \$code >&2" </dev/null 2>$tmp
exit `sed -e '/^'$command': exit [0-9][0-9]*$/!d' -e 's/.* //' $tmp`
