aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2017-01-26 00:27:53 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2017-01-26 00:27:53 +0100
commit06f20bf675cdd415c2f796ebea9fc55030ef49cc (patch)
tree04aa11f7829e346b630b2e8cb62a52d3b488d330
parent7dd906a3884a31458d30fc43eb9885c5adf4bbea (diff)
downloadbusybox-w32-06f20bf675cdd415c2f796ebea9fc55030ef49cc.tar.gz
busybox-w32-06f20bf675cdd415c2f796ebea9fc55030ef49cc.tar.bz2
busybox-w32-06f20bf675cdd415c2f796ebea9fc55030ef49cc.zip
link: new applet
coreutils grew itself a tiny simplistic alternative to ln: Usage: link FILE LINK Create hard LINK to FILE function old new delta link_main - 75 +75 packed_usage 31114 31131 +17 applet_names 2564 2569 +5 applet_main 1480 1484 +4 applet_install_loc 185 186 +1 ------------------------------------------------------------------------------ (add/remove: 1/0 grow/shrink: 4/0 up/down: 102/0) Total: 102 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--archival/libarchive/data_extract_all.c6
-rw-r--r--coreutils/link.c41
-rw-r--r--docs/nofork_noexec.txt32
3 files changed, 71 insertions, 8 deletions
diff --git a/archival/libarchive/data_extract_all.c b/archival/libarchive/data_extract_all.c
index bd034afdc..1830ffb8d 100644
--- a/archival/libarchive/data_extract_all.c
+++ b/archival/libarchive/data_extract_all.c
@@ -127,8 +127,9 @@ void FAST_FUNC data_extract_all(archive_handle_t *archive_handle)
127 if (hard_link) { 127 if (hard_link) {
128 res = link(hard_link, dst_name); 128 res = link(hard_link, dst_name);
129 if (res != 0 && !(archive_handle->ah_flags & ARCHIVE_EXTRACT_QUIET)) { 129 if (res != 0 && !(archive_handle->ah_flags & ARCHIVE_EXTRACT_QUIET)) {
130 /* shared message */
130 bb_perror_msg("can't create %slink " 131 bb_perror_msg("can't create %slink "
131 "from %s to %s", "hard", 132 "%s to %s", "hard",
132 dst_name, 133 dst_name,
133 hard_link); 134 hard_link);
134 } 135 }
@@ -181,8 +182,9 @@ void FAST_FUNC data_extract_all(archive_handle_t *archive_handle)
181 if (res != 0 182 if (res != 0
182 && !(archive_handle->ah_flags & ARCHIVE_EXTRACT_QUIET) 183 && !(archive_handle->ah_flags & ARCHIVE_EXTRACT_QUIET)
183 ) { 184 ) {
185 /* shared message */
184 bb_perror_msg("can't create %slink " 186 bb_perror_msg("can't create %slink "
185 "from %s to %s", "sym", 187 "%s to %s", "sym",
186 dst_name, 188 dst_name,
187 file_header->link_target); 189 file_header->link_target);
188 } 190 }
diff --git a/coreutils/link.c b/coreutils/link.c
new file mode 100644
index 000000000..ac3ef85d9
--- /dev/null
+++ b/coreutils/link.c
@@ -0,0 +1,41 @@
1/*
2 * link implementation for busybox
3 *
4 * Copyright (C) 2017 Denys Vlasenko <vda.linux@googlemail.com>
5 *
6 * Licensed under GPLv2, see file LICENSE in this source tree.
7 */
8//config:config LINK
9//config: bool "link"
10//config: default y
11//config: help
12//config: link creates hard links between files.
13
14//applet:IF_LINK(APPLET_NOFORK(link, link, BB_DIR_BIN, BB_SUID_DROP, link))
15
16//kbuild:lib-$(CONFIG_LINK) += link.o
17
18//usage:#define link_trivial_usage
19//usage: "FILE LINK"
20//usage:#define link_full_usage "\n\n"
21//usage: "Create hard LINK to FILE"
22
23#include "libbb.h"
24
25/* This is a NOFORK applet. Be very careful! */
26
27int link_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
28int link_main(int argc UNUSED_PARAM, char **argv)
29{
30 opt_complementary = "=2"; /* exactly 2 params */
31 getopt32(argv, "");
32 argv += optind;
33 if (link(argv[0], argv[1]) != 0) {
34 /* shared message */
35 bb_perror_msg_and_die("can't create %slink "
36 "%s to %s", "hard",
37 argv[1], argv[0]
38 );
39 }
40 return EXIT_SUCCESS;
41}
diff --git a/docs/nofork_noexec.txt b/docs/nofork_noexec.txt
index c58f5a83f..2fb184a03 100644
--- a/docs/nofork_noexec.txt
+++ b/docs/nofork_noexec.txt
@@ -33,6 +33,7 @@ roughly are:
33* do not expect shared global variables/buffers to be in their 33* do not expect shared global variables/buffers to be in their
34 "initialized" state. Examples: xfunc_error_retval can be != 1, 34 "initialized" state. Examples: xfunc_error_retval can be != 1,
35 bb_common_bufsiz1 can be scribbled over, ... 35 bb_common_bufsiz1 can be scribbled over, ...
36 (although usually xfunc_error_retval's state is not a problem).
36* do not expect that stdio wasn't used before. Calling set[v]buf() 37* do not expect that stdio wasn't used before. Calling set[v]buf()
37 can be disastrous. 38 can be disastrous.
38* ... 39* ...
@@ -81,18 +82,37 @@ are probably not worth the effort.
81Any NOFORK applet is also a NOEXEC applet. 82Any NOFORK applet is also a NOEXEC applet.
82 83
83 84
85 Calling NOFORK applets
86
87API to call NOFORK applets is two functions:
88
89 run_nofork_applet(appno, argv)
90 spawn_and_wait(argv) // only if FEATURE_PREFER_APPLETS=y
91
92First one is directly used by shells if FEATURE_SH_NOFORK=y.
93Second one is used by many applets, but main users are xargs and find.
94It itself calls run_nofork_applet(), if argv[0] turned out to be a name
95of a NOFORK applet.
96
97run_nofork_applet() saves/inits/restores option parsing, xfunc_error_retval,
98applet_name. Thus, for example, caller does not need to worry about
99option_mask32 getting trashed.
100
101
84 Relevant CONFIG options 102 Relevant CONFIG options
85 103
86FEATURE_PREFER_APPLETS 104FEATURE_PREFER_APPLETS
87 BB_EXECVP(cmd, argv) will try to exec /proc/self/exe 105 BB_EXECVP(cmd, argv) will try to exec /proc/self/exe
88 if command's name matches some applet name 106 if command's name matches some applet name;
89 applet tables will contain NOFORK/NOEXEC bits
90 spawn_and_wait(argv) will do NOFORK/NOEXEC tricks 107 spawn_and_wait(argv) will do NOFORK/NOEXEC tricks
91 108
92FEATURE_SH_STANDALONE (needs FEATURE_PREFER_APPLETS=y) 109//TODO: the above two things probably should have separate options?
110
111FEATURE_SH_STANDALONE
93 shells will try to exec /proc/self/exe if command's name matches 112 shells will try to exec /proc/self/exe if command's name matches
94 some applet name 113 some applet name; shells will do NOEXEC trick on NOEXEC applets
95 shells will do NOEXEC trick on NOEXEC applets 114
115//TODO: split (same as for PREFER_APPLETS)
96 116
97FEATURE_SH_NOFORK (needs FEATURE_PREFER_APPLETS=y) 117FEATURE_SH_NOFORK
98 shells will do NOFORK trick on NOFORK applets 118 shells will do NOFORK trick on NOFORK applets