[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: portable tests for symlinks (was patch for autoconf manual)
From: |
Martin Pool |
Subject: |
Re: portable tests for symlinks (was patch for autoconf manual) |
Date: |
Tue, 9 Apr 2002 12:45:52 +1000 |
User-agent: |
Mutt/1.3.28i |
On 14 Mar 2002, Akim Demaille <address@hidden> wrote:
> Would you contribute the text itself? TIA!
Yes, I'd be happy to help.
I can't promise that the solution outlined below works everywhere, but
it has been tested on a number of unix-like platforms and seems to be
OK. I suppose at least making people aware of the problem is better
than nothing.
Basically, we ended up using this code, in
<http://cvs.samba.org/cgi-bin/cvsweb/rsync/testsuite/rsync.fns?rev=1.49&content-type=text/x-cvsweb-markup>
# Determine what shell command will appropriately test for links.
ln -s foo "$scratchdir/testlink"
for cmd in test /bin/test /usr/bin/test /usr/ucb/bin/test /usr/ucb/test
do
for switch in -h -L
do
if $cmd $switch "$scratchdir/testlink" 2>/dev/null
then
# how nice
TEST_SYMLINK_CMD="$cmd $switch"
# i wonder if break 2 is portable?
break 2
fi
done
done
# ok, now get rid of it
rm "$scratchdir/testlink"
if [ "x$TEST_SYMLINK_CMD" = 'x' ]
then
test_fail "Couldn't determine how to test for symlinks"
else
echo "Testing for symlinks using '$TEST_SYMLINK_CMD'"
fi
Obviously some of the code is specific to our test framework, but you
get the idea. To handle various platforms it seemed necessary to try
both the builtin and external test commands. Neither -h nor -L
reliably works on all platforms.
Rather than just documenting this restriction, it might be best to add
an autoconf macro that performs this determination. Otherwise,
perhaps just add this paragraph in the "limitations of builtins"
section:
`test' (symlinks)
On different platforms, the `-h' or `-L' options to `test' may be
used to determine if a file is a symbolic link. GNU `test' supports
both, but on some platforms only one or the other will work. On
some systems such as Solaris, the builtin and external versions of
`test' may support different option. (On Solaris, using the wrong
option produces the misleading message "argument expected".)
It seems that the best solution is to try both `-h' and `-L', and
each one of
test /bin/test /usr/bin/test /usr/ucb/bin/test /usr/ucb/test
until you find one that correctly detects symbolic links; then use
that command for the rest of your script.
Regards,
--
Martin
- Re: portable tests for symlinks (was patch for autoconf manual),
Martin Pool <=