aboutsummaryrefslogtreecommitdiff
path: root/coreutils
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2018-07-25 10:41:42 +0100
committerRon Yorston <rmy@pobox.com>2018-07-25 10:41:42 +0100
commit59873514f17cefd6ba3997dad5779f75433fd4e6 (patch)
tree1c9d0a3450ed95f0b820285b9f9fc217c902e652 /coreutils
parent779fd5745ac11bf752f5f4b977a274a39c192f90 (diff)
parent81de30de05beebabfa72f2a01ec4f33e9a1923e3 (diff)
downloadbusybox-w32-59873514f17cefd6ba3997dad5779f75433fd4e6.tar.gz
busybox-w32-59873514f17cefd6ba3997dad5779f75433fd4e6.tar.bz2
busybox-w32-59873514f17cefd6ba3997dad5779f75433fd4e6.zip
Merge branch 'busybox'
Diffstat (limited to 'coreutils')
-rw-r--r--coreutils/Config.src2
-rw-r--r--coreutils/cp.c24
-rw-r--r--coreutils/install.c6
-rw-r--r--coreutils/nproc.c44
-rw-r--r--coreutils/readlink.c2
-rw-r--r--coreutils/realpath.c2
-rw-r--r--coreutils/sort.c47
7 files changed, 93 insertions, 34 deletions
diff --git a/coreutils/Config.src b/coreutils/Config.src
index 7a8a3a634..1bded03a6 100644
--- a/coreutils/Config.src
+++ b/coreutils/Config.src
@@ -1,6 +1,6 @@
1# 1#
2# For a description of the syntax of this configuration file, 2# For a description of the syntax of this configuration file,
3# see scripts/kbuild/config-language.txt. 3# see docs/Kconfig-language.txt.
4# 4#
5 5
6menu "Coreutils" 6menu "Coreutils"
diff --git a/coreutils/cp.c b/coreutils/cp.c
index 455bffbba..ae60623d3 100644
--- a/coreutils/cp.c
+++ b/coreutils/cp.c
@@ -24,6 +24,11 @@
24//config: help 24//config: help
25//config: Enable long options. 25//config: Enable long options.
26//config: Also add support for --parents option. 26//config: Also add support for --parents option.
27//config:
28//config:config FEATURE_CP_REFLINK
29//config: bool "Enable --reflink[=auto]"
30//config: default y
31//config: depends on FEATURE_CP_LONG_OPTIONS
27 32
28//applet:IF_CP(APPLET_NOEXEC(cp, cp, BB_DIR_BIN, BB_SUID_DROP, cp)) 33//applet:IF_CP(APPLET_NOEXEC(cp, cp, BB_DIR_BIN, BB_SUID_DROP, cp))
29/* NOEXEC despite cases when it can be a "runner" (cp -r LARGE_DIR NEW_DIR) */ 34/* NOEXEC despite cases when it can be a "runner" (cp -r LARGE_DIR NEW_DIR) */
@@ -72,10 +77,14 @@ int cp_main(int argc, char **argv)
72#if ENABLE_FEATURE_CP_LONG_OPTIONS 77#if ENABLE_FEATURE_CP_LONG_OPTIONS
73 /*OPT_rmdest = FILEUTILS_RMDEST = 1 << FILEUTILS_CP_OPTNUM */ 78 /*OPT_rmdest = FILEUTILS_RMDEST = 1 << FILEUTILS_CP_OPTNUM */
74 OPT_parents = 1 << (FILEUTILS_CP_OPTNUM+1), 79 OPT_parents = 1 << (FILEUTILS_CP_OPTNUM+1),
80 OPT_reflink = 1 << (FILEUTILS_CP_OPTNUM+2),
75#endif 81#endif
76 }; 82 };
77 83
78#if ENABLE_FEATURE_CP_LONG_OPTIONS 84#if ENABLE_FEATURE_CP_LONG_OPTIONS
85# if ENABLE_FEATURE_CP_REFLINK
86 char *reflink = NULL;
87# endif
79 flags = getopt32long(argv, "^" 88 flags = getopt32long(argv, "^"
80 FILEUTILS_CP_OPTSTR 89 FILEUTILS_CP_OPTSTR
81 "\0" 90 "\0"
@@ -99,7 +108,22 @@ int cp_main(int argc, char **argv)
99 "update\0" No_argument "u" 108 "update\0" No_argument "u"
100 "remove-destination\0" No_argument "\xff" 109 "remove-destination\0" No_argument "\xff"
101 "parents\0" No_argument "\xfe" 110 "parents\0" No_argument "\xfe"
111# if ENABLE_FEATURE_CP_REFLINK
112 "reflink\0" Optional_argument "\xfd"
113 , &reflink
114# endif
102 ); 115 );
116# if ENABLE_FEATURE_CP_REFLINK
117 BUILD_BUG_ON(OPT_reflink != FILEUTILS_REFLINK);
118 if (flags & FILEUTILS_REFLINK) {
119 if (!reflink)
120 flags |= FILEUTILS_REFLINK_ALWAYS;
121 else if (strcmp(reflink, "always") == 0)
122 flags |= FILEUTILS_REFLINK_ALWAYS;
123 else if (strcmp(reflink, "auto") != 0)
124 bb_show_usage();
125 }
126# endif
103#else 127#else
104 flags = getopt32(argv, "^" 128 flags = getopt32(argv, "^"
105 FILEUTILS_CP_OPTSTR 129 FILEUTILS_CP_OPTSTR
diff --git a/coreutils/install.c b/coreutils/install.c
index 2e4dc257f..8270490bd 100644
--- a/coreutils/install.c
+++ b/coreutils/install.c
@@ -214,7 +214,11 @@ int install_main(int argc, char **argv)
214 dest = last; 214 dest = last;
215 if (opts & OPT_MKDIR_LEADING) { 215 if (opts & OPT_MKDIR_LEADING) {
216 char *ddir = xstrdup(dest); 216 char *ddir = xstrdup(dest);
217 bb_make_directory(dirname(ddir), 0755, mkdir_flags); 217 /*
218 * -D -t DIR1/DIR2/F3 FILE: create DIR1/DIR2/F3, copy FILE there
219 * -D FILE DIR1/DIR2/F3: create DIR1/DIR2, copy FILE there as F3
220 */
221 bb_make_directory((opts & OPT_TARGET) ? ddir : dirname(ddir), 0755, mkdir_flags);
218 /* errors are not checked. copy_file 222 /* errors are not checked. copy_file
219 * will fail if dir is not created. 223 * will fail if dir is not created.
220 */ 224 */
diff --git a/coreutils/nproc.c b/coreutils/nproc.c
index 336b176ca..0ea8d1001 100644
--- a/coreutils/nproc.c
+++ b/coreutils/nproc.c
@@ -14,10 +14,14 @@
14//kbuild:lib-$(CONFIG_NPROC) += nproc.o 14//kbuild:lib-$(CONFIG_NPROC) += nproc.o
15 15
16//usage:#define nproc_trivial_usage 16//usage:#define nproc_trivial_usage
17//usage: "" 17//usage: ""IF_LONG_OPTS("--all --ignore=N")
18//TODO: "[--all] [--ignore=N]"
19//usage:#define nproc_full_usage "\n\n" 18//usage:#define nproc_full_usage "\n\n"
20//usage: "Print number of CPUs" 19//usage: "Print number of available CPUs"
20//usage: IF_LONG_OPTS(
21//usage: "\n"
22//usage: "\n --all Number of installed CPUs"
23//usage: "\n --ignore=N Exclude N CPUs"
24//usage: )
21 25
22#include <sched.h> 26#include <sched.h>
23#include "libbb.h" 27#include "libbb.h"
@@ -26,13 +30,30 @@ int nproc_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
26int nproc_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM) 30int nproc_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
27{ 31{
28 unsigned long mask[1024]; 32 unsigned long mask[1024];
29 unsigned i, count = 0; 33 int count = 0;
30 34#if ENABLE_LONG_OPTS
31 //getopt32(argv, ""); 35 int ignore = 0;
32 36 int opts = getopt32long(argv, "\xfe:+",
33 //if --all, count /sys/devices/system/cpu/cpuN dirs, else: 37 "ignore\0" Required_argument "\xfe"
38 "all\0" No_argument "\xff"
39 , &ignore
40 );
34 41
42 if (opts & (1 << 1)) {
43 DIR *cpusd = opendir("/sys/devices/system/cpu");
44 if (cpusd) {
45 struct dirent *de;
46 while (NULL != (de = readdir(cpusd))) {
47 char *cpuid = strstr(de->d_name, "cpu");
48 if (cpuid && isdigit(cpuid[strlen(cpuid) - 1]))
49 count++;
50 }
51 closedir(cpusd);
52 }
53 } else
54#endif
35 if (sched_getaffinity(0, sizeof(mask), (void*)mask) == 0) { 55 if (sched_getaffinity(0, sizeof(mask), (void*)mask) == 0) {
56 int i;
36 for (i = 0; i < ARRAY_SIZE(mask); i++) { 57 for (i = 0; i < ARRAY_SIZE(mask); i++) {
37 unsigned long m = mask[i]; 58 unsigned long m = mask[i];
38 while (m) { 59 while (m) {
@@ -42,8 +63,11 @@ int nproc_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
42 } 63 }
43 } 64 }
44 } 65 }
45 if (count == 0) 66
46 count++; 67 IF_LONG_OPTS(count -= ignore;)
68 if (count <= 0)
69 count = 1;
70
47 printf("%u\n", count); 71 printf("%u\n", count);
48 72
49 return 0; 73 return 0;
diff --git a/coreutils/readlink.c b/coreutils/readlink.c
index b8e327d11..49361cea0 100644
--- a/coreutils/readlink.c
+++ b/coreutils/readlink.c
@@ -86,7 +86,7 @@ int readlink_main(int argc UNUSED_PARAM, char **argv)
86 86
87 /* NOFORK: only one alloc is allowed; must free */ 87 /* NOFORK: only one alloc is allowed; must free */
88 if (opt & 1) { /* -f */ 88 if (opt & 1) { /* -f */
89 buf = xmalloc_realpath(fname); 89 buf = xmalloc_realpath_coreutils(fname);
90 } else { 90 } else {
91 buf = xmalloc_readlink_or_warn(fname); 91 buf = xmalloc_readlink_or_warn(fname);
92 } 92 }
diff --git a/coreutils/realpath.c b/coreutils/realpath.c
index aa878fcd2..43923681c 100644
--- a/coreutils/realpath.c
+++ b/coreutils/realpath.c
@@ -38,7 +38,7 @@ int realpath_main(int argc UNUSED_PARAM, char **argv)
38 38
39 do { 39 do {
40 /* NOFORK: only one alloc is allowed; must free */ 40 /* NOFORK: only one alloc is allowed; must free */
41 char *resolved_path = xmalloc_realpath(*argv); 41 char *resolved_path = xmalloc_realpath_coreutils(*argv);
42 if (resolved_path != NULL) { 42 if (resolved_path != NULL) {
43 puts(resolved_path); 43 puts(resolved_path);
44 free(resolved_path); 44 free(resolved_path);
diff --git a/coreutils/sort.c b/coreutils/sort.c
index 4d741e76d..05e5c9071 100644
--- a/coreutils/sort.c
+++ b/coreutils/sort.c
@@ -60,6 +60,7 @@
60//usage: IF_FEATURE_SORT_BIG( 60//usage: IF_FEATURE_SORT_BIG(
61//usage: "\n -g General numerical sort" 61//usage: "\n -g General numerical sort"
62//usage: "\n -M Sort month" 62//usage: "\n -M Sort month"
63//usage: "\n -V Sort version"
63//usage: "\n -t CHAR Field separator" 64//usage: "\n -t CHAR Field separator"
64//usage: "\n -k N[,M] Sort by Nth field" 65//usage: "\n -k N[,M] Sort by Nth field"
65//usage: ) 66//usage: )
@@ -91,32 +92,33 @@
91 92
92/* These are sort types */ 93/* These are sort types */
93enum { 94enum {
94 FLAG_n = 1, /* Numeric sort */ 95 FLAG_n = 1 << 0, /* Numeric sort */
95 FLAG_g = 2, /* Sort using strtod() */ 96 FLAG_g = 1 << 1, /* Sort using strtod() */
96 FLAG_M = 4, /* Sort date */ 97 FLAG_M = 1 << 2, /* Sort date */
98 FLAG_V = 1 << 3, /* Sort version */
97/* ucsz apply to root level only, not keys. b at root level implies bb */ 99/* ucsz apply to root level only, not keys. b at root level implies bb */
98 FLAG_u = 8, /* Unique */ 100 FLAG_u = 1 << 4, /* Unique */
99 FLAG_c = 0x10, /* Check: no output, exit(!ordered) */ 101 FLAG_c = 1 << 5, /* Check: no output, exit(!ordered) */
100 FLAG_s = 0x20, /* Stable sort, no ascii fallback at end */ 102 FLAG_s = 1 << 6, /* Stable sort, no ascii fallback at end */
101 FLAG_z = 0x40, /* Input and output is NUL terminated, not \n */ 103 FLAG_z = 1 << 7, /* Input and output is NUL terminated, not \n */
102/* These can be applied to search keys, the previous four can't */ 104/* These can be applied to search keys, the previous four can't */
103 FLAG_b = 0x80, /* Ignore leading blanks */ 105 FLAG_b = 1 << 8, /* Ignore leading blanks */
104 FLAG_r = 0x100, /* Reverse */ 106 FLAG_r = 1 << 9, /* Reverse */
105 FLAG_d = 0x200, /* Ignore !(isalnum()|isspace()) */ 107 FLAG_d = 1 << 10, /* Ignore !(isalnum()|isspace()) */
106 FLAG_f = 0x400, /* Force uppercase */ 108 FLAG_f = 1 << 11, /* Force uppercase */
107 FLAG_i = 0x800, /* Ignore !isprint() */ 109 FLAG_i = 1 << 12, /* Ignore !isprint() */
108 FLAG_m = 0x1000, /* ignored: merge already sorted files; do not sort */ 110 FLAG_m = 1 << 13, /* ignored: merge already sorted files; do not sort */
109 FLAG_S = 0x2000, /* ignored: -S, --buffer-size=SIZE */ 111 FLAG_S = 1 << 14, /* ignored: -S, --buffer-size=SIZE */
110 FLAG_T = 0x4000, /* ignored: -T, --temporary-directory=DIR */ 112 FLAG_T = 1 << 15, /* ignored: -T, --temporary-directory=DIR */
111 FLAG_o = 0x8000, 113 FLAG_o = 1 << 16,
112 FLAG_k = 0x10000, 114 FLAG_k = 1 << 17,
113 FLAG_t = 0x20000, 115 FLAG_t = 1 << 18,
114 FLAG_bb = 0x80000000, /* Ignore trailing blanks */ 116 FLAG_bb = 0x80000000, /* Ignore trailing blanks */
115 FLAG_no_tie_break = 0x40000000, 117 FLAG_no_tie_break = 0x40000000,
116}; 118};
117 119
118static const char sort_opt_str[] ALIGN1 = "^" 120static const char sort_opt_str[] ALIGN1 = "^"
119 "ngMucszbrdfimS:T:o:k:*t:" 121 "ngMVucszbrdfimS:T:o:k:*t:"
120 "\0" "o--o:t--t"/*-t, -o: at most one of each*/; 122 "\0" "o--o:t--t"/*-t, -o: at most one of each*/;
121/* 123/*
122 * OPT_STR must not be string literal, needs to have stable address: 124 * OPT_STR must not be string literal, needs to have stable address:
@@ -273,10 +275,15 @@ static int compare_keys(const void *xarg, const void *yarg)
273 y = *(char **)yarg; 275 y = *(char **)yarg;
274#endif 276#endif
275 /* Perform actual comparison */ 277 /* Perform actual comparison */
276 switch (flags & (FLAG_n | FLAG_M | FLAG_g)) { 278 switch (flags & (FLAG_n | FLAG_g | FLAG_M | FLAG_V)) {
277 default: 279 default:
278 bb_error_msg_and_die("unknown sort type"); 280 bb_error_msg_and_die("unknown sort type");
279 break; 281 break;
282#if defined(HAVE_STRVERSCMP) && HAVE_STRVERSCMP == 1
283 case FLAG_V:
284 retval = strverscmp(x, y);
285 break;
286#endif
280 /* Ascii sort */ 287 /* Ascii sort */
281 case 0: 288 case 0:
282#if ENABLE_LOCALE_SUPPORT 289#if ENABLE_LOCALE_SUPPORT