summaryrefslogtreecommitdiff
path: root/tests/ln
diff options
context:
space:
mode:
authorPádraig Brady <P@draigBrady.com>2014-01-17 03:54:29 +0000
committerPádraig Brady <P@draigBrady.com>2014-01-17 11:52:42 +0000
commit7fa1641db049912f59654153d077953714720ca2 (patch)
treeb9bf1910a6fa9f1ad26fb5d324455a0aa53b83a9 /tests/ln
parent745de6dca52ef32cdaf9c459414b53d8a48459c3 (diff)
downloadcoreutils-7fa1641db049912f59654153d077953714720ca2.tar.xz
ln: fix replacing symbolic links whose targets can't exist
* src/ln.c (errno_nonexisting): A new function to determine if the errno implies that a file doesn't or can't (currently) exist. (target_directory_operand): Use the new function to expand the set of errors we handle. * tests/ln/sf-1.sh: Add test cases for the newly handled errors. * THANKS.in: Mention the reporter. * NEWS: Mention the bug fix.
Diffstat (limited to 'tests/ln')
-rwxr-xr-xtests/ln/sf-1.sh17
1 files changed, 16 insertions, 1 deletions
diff --git a/tests/ln/sf-1.sh b/tests/ln/sf-1.sh
index 3f4f8f1ae..17e67a9fb 100755
--- a/tests/ln/sf-1.sh
+++ b/tests/ln/sf-1.sh
@@ -20,12 +20,27 @@
print_ver_ ln
echo foo > a || framework_failure_
-ln -s . b || framework_failure_
+# Check that a target directory of '.' is supported
+# and that indirectly specifying the same target and link name
+# through that is detected.
+ln -s . b || framework_failure_
ln -sf a b > err 2>&1 && fail=1
case $(cat err) in
*'are the same file') ;;
*) fail=1 ;;
esac
+# Ensure we replace symlinks that don't or can't link to an existing target.
+# coreutils-8.22 would fail to replace {ENOTDIR,ELOOP,ENAMETOOLONG}_link below.
+name_max_plus1=$(expr $(stat -f -c %l .) + 1)
+test $name_max_plus1 -gt 1 || skip_ 'Error determining NAME_MAX'
+long_name=$(printf '%0*d' $name_max_plus1 0)
+for f in '' f; do
+ ln -s$f missing ENOENT_link || fail=1
+ ln -s$f a/b ENOTDIR_link || fail=1
+ ln -s$f ELOOP_link ELOOP_link || fail=1
+ ln -s$f "$long_name" ENAMETOOLONG_link || fail=1
+done
+
Exit $fail