summaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/opkg/opkg/alternatives-ln.patch
blob: f257eb0e1c85074f5233b06bed66290834c9348f (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
update-alternatives: use 'ln -n'

Using the '-n' option (--no-dereference) is a better way to solve the
do-not-link-into-directory issue.  Using only 'ln -sf' can cause problems
on SELinux enabled hosts when target is inaccessible; e.g. when preparing
an offline rootsystem:

 | $ cd <offline root>
 | $ ln -sf /lib/systemd/systemd sbin/init     # alternative #1
 | $ ln -sf /bin/busybox sbin/init             # alternative #2
 | ln: accessing `sbin/init': Permission denied
 | 
 |  --> strace:
 | brk(0)                                  = 0x102b000
 | stat("sbin/init", 0x7fffaa91c900)       = -1 EACCES (Permission denied)
 | ...
 | exit_group(1)                           = ?

Now with '-n':

 | $ ln -snf /bin/busybox sbin/init
 | lstat("sbin/init", {st_mode=S_IFLNK|0777, st_size=20, ...}) = 0
 | lstat("sbin/init", {st_mode=S_IFLNK|0777, st_size=20, ...}) = 0
 | stat("/bin/busybox", 0x7fff8c1a3bd0)    = -1 ENOENT (No such file or directory)
 | symlink("/bin/busybox", "sbin/init")    = -1 EEXIST (File exists)
 | unlink("sbin/init")                     = 0
 | symlink("/bin/busybox", "sbin/init")    = 0


The '-n' flag is well supported (coreutils have it at least since
1999, busybox at least since 0.60.3 (2002)) and it obsoletes the
explicit check whether target is a directory.

Upstream-Status: pending [http://code.google.com/p/opkg/issues/detail?id=95]
Signed-off-by: Enrico Scholz <enrico.scholz@sigma-chemnitz.de>

Index: trunk/utils/update-alternatives.in
===================================================================
--- trunk.orig/utils/update-alternatives.in
+++ trunk/utils/update-alternatives.in
@@ -113,14 +113,7 @@ find_best_alt() {
 		if [ ! -d $link_dir ]; then
 			mkdir -p $link_dir
 		fi
-		if [ -h $link -a -d $link ]; then
-			# If $link exists and the target is a directory,
-			# 'ln -sf $path $link' doesn't replace the link to
-			# that directory, it creates new link inside.
-			echo "update-alternatives: Removing $link".
-			rm -f $link
-		fi
-		ln -sf $path $link
+		ln -snf $path $link
 		echo "update-alternatives: Linking $link to $path"
 	else
 		echo "update-alternatives: Error: not linking $link to $path since $link exists and is not a link"