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
|
From 71b268c7d962a819f88050c2567dced975aa249e Mon Sep 17 00:00:00 2001
From: Kaarle Ritvanen <kaarle.ritvanen@datakunkku.fi>
Date: Tue, 8 Oct 2019 14:07:50 +0200
Subject: [PATCH] ln: --no-target-directory implies --no-dereference
as in GNU coreutils
Signed-off-by: Kaarle Ritvanen <kaarle.ritvanen@datakunkku.fi>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
---
coreutils/ln.c | 25 +++++++++++++++++++++----
1 file changed, 21 insertions(+), 4 deletions(-)
diff --git a/coreutils/ln.c b/coreutils/ln.c
index ea2d10eab..5591e8335 100644
--- a/coreutils/ln.c
+++ b/coreutils/ln.c
@@ -41,7 +41,6 @@
/* This is a NOEXEC applet. Be very careful! */
-
#define LN_SYMLINK (1 << 0)
#define LN_FORCE (1 << 1)
#define LN_NODEREFERENCE (1 << 2)
@@ -63,7 +62,22 @@ int ln_main(int argc, char **argv)
int (*link_func)(const char *, const char *);
opts = getopt32(argv, "^" "sfnbS:vT" "\0" "-1", &suffix);
-
+/*
+ -s, --symbolic make symbolic links instead of hard links
+ -f, --force remove existing destination files
+ -n, --no-dereference treat LINK_NAME as a normal file if it is a symbolic link to a directory
+ -b like --backup but does not accept an argument
+ --backup[=CONTROL] make a backup of each existing destination file
+ -S, --suffix=SUFFIX override the usual backup suffix
+ -v, --verbose
+ -T, --no-target-directory
+ -d, -F, --directory allow the superuser to attempt to hard link directories
+ -i, --interactive prompt whether to remove destinations
+ -L, --logical dereference TARGETs that are symbolic links
+ -P, --physical make hard links directly to symbolic links
+ -r, --relative create symbolic links relative to link location
+ -t, --target-directory=DIRECTORY specify the DIRECTORY in which to create the links
+ */
last = argv[argc - 1];
argv += optind;
argc -= optind;
@@ -86,8 +100,11 @@ int ln_main(int argc, char **argv)
src = last;
if (is_directory(src,
- (opts & LN_NODEREFERENCE) ^ LN_NODEREFERENCE
- )
+ /*followlinks:*/ !(opts & (LN_NODEREFERENCE|LN_LINKFILE))
+ /* Why LN_LINKFILE does not follow links:
+ * -T/--no-target-directory implies -n/--no-dereference
+ */
+ )
) {
if (opts & LN_LINKFILE) {
bb_error_msg_and_die("'%s' is a directory", src);
--
2.20.1
|