#! /bin/sh# quote.test - make sure that shell metacharacters do not blow up libtool# Test script header.need_prefix=noif test -z "$srcdir"; thensrcdir=`echo "$0" | sed 's%/[^/]*$%%'`test "$srcdir" = "$0" && srcdir=.test "${VERBOSE+set}" != "set" && VERBOSE=yesfi. $srcdir/defs || exit 1# Do the torture test.status=0echo=echoif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then :else# The Solaris, AIX, and Digital Unix default echo programs unquote# backslashes. This makes it impossible to quote backslashes using# echo "$something" | sed 's/\\/\\\\/g'## So, first we look for a working echo in the user's PATH.IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}:"for dir in $PATH /usr/ucb; doif test -f $dir/echo && test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t'; thenecho="$dir/echo"breakfidoneIFS="$save_ifs"if test "X$echo" = Xecho; then# We didn't find a better echo, so look for alternatives.if test "X`(print -r '\t') 2>/dev/null`" = 'X\t'; then# This shell has a builtin print -r that does the trick.echo='print -r'elif test -f /bin/ksh && test "X$CONFIG_SHELL" != X/bin/ksh; then# If we have ksh, try running $0 again with it.CONFIG_SHELL=/bin/kshexport CONFIG_SHELLexec "$CONFIG_SHELL" "$0" --no-reexec ${1+"$@"}else# Try using printf.echo='printf %s\n'if test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then :else# Oops. We lost completely, so just stick with echo.echo=echofifififi# Extract $wl from the libtool configurationeval `$libtool --config | grep '^wl='`for mode in compile link install; do$echo "== $mode mode"# Unfortunately, without an array data type, it is nearly impossible# to protect libtool from metacharacters in filenames. So, we just# try metacharacters in the options it needs to pass to other programs.# preargs and postargs need to go through libtool unmodified.case "$mode" incompile)preargs="$CC -c"preflag=match_preflag=flag="-DVAR="postargs="foo.c";;link)preargs="$CC -o hell -g -O"preflag=-Wl,match_preflag="$wl"flag="-someflag="postargs="foo.o";;install)preargs="install -c"preflag=match_preflag=flag="--something="postargs="hell /usr/local/bin/hell";;esac# Trivial.$echo "= trying: no quoting"result=`$libtool -n --mode=$mode $preargs ${preflag}"${flag}test" $postargs` || status=1# We used to have the contents of $match in the case statement,# without an intermediate variable, but it would fail on at least# Solaris' and HP-UX's /bin/sh. Ugh!# We must nost attempt to match $preargs in the output, because libtool# may modify them. For example, on Cygwin, ``libtool --mode=link gcc -o# foo foo.o'' becomes ``gcc -o foo.exe foo.o''.match="${match_preflag}${flag}test "case "$result" in*"$match"*)$echo "= passed: $result";;*)$echo "= failed: $result"status=1;;esac# Metacharacters that should be backslashified.for mchar in \\ \" \` \$; do$echo "= trying: \\$mchar quoting"result=`$libtool -n --mode=$mode $preargs ${preflag}"${flag}${mchar}test${mchar}" $postargs` || status=1match="${match_preflag}${flag}\\${mchar}test\\${mchar} "case "$result" in*"$match"*)$echo "= passed: $result";;*)$echo "= failed: $result"status=1;;esacdone# Metacharacters that should be double quoted.for mchar in "[" "]" "~" "#" "^" "&" "*" "(" ")" "{" "}" "|" ";" "<" ">" "?" \"'" " " " "; do$echo "= trying: \"$mchar\" quoting"result=`$libtool -n --mode=$mode $preargs ${preflag}"${flag}${mchar}test${mchar}" $postargs` || status=1match="${match_preflag}\"${flag}${mchar}test${mchar}\" "case "$result" in*"$match"*)$echo "= passed: $result";;*)$echo "= failed: $result"status=1;;esacdonedoneexit $status