summaryrefslogtreecommitdiff
path: root/tests/ln/misc
blob: f8ec46fcabea1d8b1e29f7a242303fd34c6e5ca6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#!/bin/sh
# Miscellaneous tests for "ln".

# Copyright (C) 1998-2000, 2004, 2006-2008 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

t=tln-symlink
d=tln-subdir
ld=tln-symlink-to-subdir
f=tln-file
fail=0

# Create a simple symlink with both source and destination files
# in current directory.
touch $f || framework_failure
rm -f $t || framework_failure
ln -s $f $t || fail=1
test -f $t || fail=1
rm $t $f

# Create a symlink with source file and explicit destination directory/file.
touch $f || framework_failure
rm -rf $d || framework_failure
mkdir $d || framework_failure
ln -s ../$f $d/$t || fail=1
test -f $d/$t || fail=1
rm -rf $d $f

# Create a symlink with source file and destination directory.
touch $f || framework_failure
rm -rf $d || framework_failure
mkdir $d || framework_failure
ln -s ../$f $d || fail=1
test -f $d/$f || fail=1
rm -rf $d $f

# See whether a trailing slash is followed too far.
touch $f || framework_failure
rm -rf $d || framework_failure
mkdir $d $d/$f || framework_failure
ln $f $d/ 2> /dev/null && fail=1
ln -s $f $d/ 2> /dev/null && fail=1
rm -rf $d $f

# Make sure we get a failure with existing dest without -f option
touch $t || framework_failure
# FIXME: don't ignore the error message but rather test
# it to make sure it's the right one.
ln -s $t $t 2> /dev/null && fail=1
rm $t

# Make sure -sf fails when src and dest are the same
touch $t || framework_failure
ln -sf $t $t 2> /dev/null && fail=1
rm $t

# Create a symlink with source file and no explicit directory
rm -rf $d || framework_failure
mkdir $d || framework_failure
touch $d/$f || framework_failure
ln -s $d/$f || fail=1
test -f $f || fail=1
rm -rf $d $f

# Create a symlink with source file and destination symlink-to-directory.
rm -rf $d $f $ld || framework_failure
touch $f || framework_failure
mkdir $d || framework_failure
ln -s $d $ld
ln -s ../$f $ld || fail=1
test -f $d/$f || fail=1
rm -rf $d $f $ld

# Create a symlink with source file and destination symlink-to-directory.
# BUT use the new --no-dereference option.
rm -rf $d $f $ld || framework_failure
touch $f || framework_failure
mkdir $d || framework_failure
ln -s $d $ld
af=`pwd`/$f
ln --no-dereference -fs "$af" $ld || fail=1
test -f $ld || fail=1
rm -rf $d $f $ld

# Try to create a symlink with backup where the destination file exists
# and the backup file name is a hard link to the destination file.
touch a b || framework_failure
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.
for cmd in ln cp mv ginstall; do
  rm -rf a x a.orig
  touch a x || framework_failure
  $cmd --backup=simple --suffix=.orig x a || fail=1
  test -f a.orig || fail=1
done

# ===================================================
# With coreutils-5.2.1, this would mistakenly access argv[1][-1].
# I'm including it here, in case some day programs like valgrind detect that.
# Purify probably would have done so.
ln foo '' 2> /dev/null

# ===================================================

(exit $fail); exit $fail