summaryrefslogtreecommitdiff
path: root/tests/ln
diff options
context:
space:
mode:
authorEric Blake <ebb9@byu.net>2009-09-24 11:57:11 -0600
committerEric Blake <ebb9@byu.net>2009-09-25 07:03:03 -0600
commitefcee783e4d576898130ccbf1cb2d7d6bf1b8420 (patch)
tree401900376fd200b55ebede212a2b777b1d3fa0d4 /tests/ln
parentfb59d72f0a48ef6bc45d795ab96131368157c59f (diff)
downloadcoreutils-efcee783e4d576898130ccbf1cb2d7d6bf1b8420.tar.xz
ln: add -L/-P options
* src/ln.c (STAT_LIKE_LINK): Delete. (logical): New flag. (long_options): Add -L, -P. (usage): Mention them. (main): Choose between them. (do_link): Perform correct action. * tests/ln/misc: Move hard-to-sym portion of test... * tests/ln/hard-to-sym: ...into new test, and add more. * tests/Makefile.am (TESTS): Run new test. * NEWS: Document this. * doc/coreutils.texi (link invocation, ln invocation): Likewise. * bootstrap.conf (gnulib_modules): Add linkat.
Diffstat (limited to 'tests/ln')
-rwxr-xr-xtests/ln/hard-to-sym82
-rwxr-xr-xtests/ln/misc23
2 files changed, 82 insertions, 23 deletions
diff --git a/tests/ln/hard-to-sym b/tests/ln/hard-to-sym
new file mode 100755
index 000000000..510b57abf
--- /dev/null
+++ b/tests/ln/hard-to-sym
@@ -0,0 +1,82 @@
+#!/bin/sh
+# Tests for ln -L/-P.
+
+# Copyright (C) 2009 Free Software Foundation, Inc.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+if test "$VERBOSE" = yes; then
+ set -x
+ ln --version
+fi
+
+. $srcdir/test-lib.sh
+
+fail=0
+
+# ===================================================
+# ensure -s silently overrides -L, -P
+touch a || framework_failure
+ln -L -s a symlink1 || fail=1
+ln -P -s symlink1 symlink2 || fail=1
+ln -s -L -P symlink2 symlink3 || fail=1
+
+# ===================================================
+# ensure that -L follows symlinks, and overrides -P
+ln -P -L symlink3 hard-to-a || fail=1
+ls=`ls -lG hard-to-a`x
+case "$ls" in
+ *'hard-to-ax') ;;
+ *'hard-to-a -> '*x) fail=1 ;;
+ *) framework_failure ;;
+esac
+
+# ===================================================
+# ensure that -P links (or at least duplicates) symlinks, and overrides -L
+ln -L -P symlink3 hard-to-3 || fail=1
+ls=`ls -lG hard-to-3`x
+case "$ls" in
+ *'hard-to-3 -> symlink2x') ;;
+ *'hard-to-3x') fail=1 ;;
+ *'hard-to-3 -> '*x) fail=1 ;;
+ *) framework_failure ;;
+esac
+
+# ===================================================
+# Create a hard link to a dangling symlink.
+ln -s /no-such-dir || framework_failure
+ln -L no-such-dir hard-to-dangle 2>err && fail=1
+case `cat err` in
+ *' accessing `no-such-dir'\':*) ;;
+ *) fail=1 ;;
+esac
+ln -P no-such-dir hard-to-dangle || fail=1
+
+# ===================================================
+# Create a hard link to a symlink to a directory.
+mkdir d || framework_failure
+ln -s d link-to-dir || framework_failure
+ln -L link-to-dir hard-to-dir-link 2>err && fail=1
+case `cat err` in
+ *': `link-to-dir'\'': hard link not allowed for directory'*) ;;
+ *) fail=1 ;;
+esac
+ln -P link-to-dir/ hard-to-dir-link 2>err && fail=1
+case `cat err` in
+ *': `link-to-dir/'\'': hard link not allowed for directory'*) ;;
+ *) fail=1 ;;
+esac
+ln -P link-to-dir hard-to-dir-link || fail=1
+
+Exit $fail
diff --git a/tests/ln/misc b/tests/ln/misc
index f13bd7bf3..d42d68a27 100755
--- a/tests/ln/misc
+++ b/tests/ln/misc
@@ -108,29 +108,6 @@ ln b b~ || framework_failure
ln -f --b=simple a b || fail=1
# ===================================================
-# determine if link(2) follows symlinks on this system
-touch a || framework_failure
-ln -s a symlink || framework_failure
-ln symlink hard-to-sym > /dev/null 2>&1 || framework_failure
-ls=`ls -lG hard-to-sym`x
-case "$ls" in
- *'hard-to-symx') link_follows_symlink=yes ;;
- *'hard-to-sym -> ax') link_follows_symlink=no ;;
- *) framework_failure ;;
-esac
-
-if test $link_follows_symlink = no; then
- # Create a hard link to a dangling symlink.
- # This is not portable. At least sunos4.1.4 and OpenBSD 2.3 fail this test.
- # They get this:
- # ln: cannot create hard link `hard-to-dangle' to `no-such-dir': \
- # No such file or directory
- #
- ln -s /no-such-dir || fail=1
- ln no-such-dir hard-to-dangle > /dev/null 2>&1 || fail=1
-fi
-rm -rf a symlink hard-to-sym hard-to-dangle
-# ===================================================
# Make sure ln can make simple backups.
# This was fixed in 4.0.34. Broken in 4.0r.