diff options
author | Ron Yorston <rmy@pobox.com> | 2015-03-23 13:56:37 +0000 |
---|---|---|
committer | Ron Yorston <rmy@pobox.com> | 2015-03-23 13:56:37 +0000 |
commit | 486a3907f353adeb7f3ced5357db1e604659b785 (patch) | |
tree | 5033870835b2b9d5b26ba1f4544943c47893b904 | |
parent | 74ba8c760f3337218cddabaaa0acc4e1f5d6e6c5 (diff) | |
parent | 1850d5ec0e90fbfb598ed7ad8ff0a63b6e5692ce (diff) | |
download | busybox-w32-486a3907f353adeb7f3ced5357db1e604659b785.tar.gz busybox-w32-486a3907f353adeb7f3ced5357db1e604659b785.tar.bz2 busybox-w32-486a3907f353adeb7f3ced5357db1e604659b785.zip |
Merge branch 'busybox' into merge
-rw-r--r-- | coreutils/dd.c | 31 | ||||
-rw-r--r-- | coreutils/truncate.c | 77 | ||||
-rw-r--r-- | include/libbb.h | 2 | ||||
-rw-r--r-- | libbb/xatonum.c | 21 | ||||
-rw-r--r-- | networking/ifupdown.c | 9 | ||||
-rw-r--r-- | networking/zcip.c | 2 | ||||
-rwxr-xr-x | scripts/trylink | 12 | ||||
-rw-r--r-- | shell/ash.c | 3 | ||||
-rw-r--r-- | sysklogd/logread.c | 16 |
9 files changed, 129 insertions, 44 deletions
diff --git a/coreutils/dd.c b/coreutils/dd.c index a01722040..589547e77 100644 --- a/coreutils/dd.c +++ b/coreutils/dd.c | |||
@@ -99,25 +99,6 @@ enum { | |||
99 | ofd = STDOUT_FILENO, | 99 | ofd = STDOUT_FILENO, |
100 | }; | 100 | }; |
101 | 101 | ||
102 | static const struct suffix_mult dd_suffixes[] = { | ||
103 | { "c", 1 }, | ||
104 | { "w", 2 }, | ||
105 | { "b", 512 }, | ||
106 | { "kB", 1000 }, | ||
107 | { "kD", 1000 }, | ||
108 | { "k", 1024 }, | ||
109 | { "K", 1024 }, /* compat with coreutils dd (it also accepts KB and KD, TODO?) */ | ||
110 | { "MB", 1000000 }, | ||
111 | { "MD", 1000000 }, | ||
112 | { "M", 1024*1024 }, | ||
113 | { "GB", 1000000000 }, | ||
114 | { "GD", 1000000000 }, | ||
115 | { "G", 1024*1024*1024 }, | ||
116 | /* "D" suffix for decimal is not in coreutils manpage, looks like it's deprecated */ | ||
117 | /* coreutils also understands TPEZY suffixes for tera- and so on, with B suffix for decimal */ | ||
118 | { "", 0 } | ||
119 | }; | ||
120 | |||
121 | struct globals { | 102 | struct globals { |
122 | off_t out_full, out_part, in_full, in_part; | 103 | off_t out_full, out_part, in_full, in_part; |
123 | #if ENABLE_FEATURE_DD_THIRD_STATUS_LINE | 104 | #if ENABLE_FEATURE_DD_THIRD_STATUS_LINE |
@@ -327,11 +308,11 @@ int dd_main(int argc UNUSED_PARAM, char **argv) | |||
327 | #if ENABLE_FEATURE_DD_IBS_OBS | 308 | #if ENABLE_FEATURE_DD_IBS_OBS |
328 | if (what == OP_ibs) { | 309 | if (what == OP_ibs) { |
329 | /* Must fit into positive ssize_t */ | 310 | /* Must fit into positive ssize_t */ |
330 | ibs = xatoul_range_sfx(val, 1, ((size_t)-1L)/2, dd_suffixes); | 311 | ibs = xatoul_range_sfx(val, 1, ((size_t)-1L)/2, cwbkMG_suffixes); |
331 | /*continue;*/ | 312 | /*continue;*/ |
332 | } | 313 | } |
333 | if (what == OP_obs) { | 314 | if (what == OP_obs) { |
334 | obs = xatoul_range_sfx(val, 1, ((size_t)-1L)/2, dd_suffixes); | 315 | obs = xatoul_range_sfx(val, 1, ((size_t)-1L)/2, cwbkMG_suffixes); |
335 | /*continue;*/ | 316 | /*continue;*/ |
336 | } | 317 | } |
337 | if (what == OP_conv) { | 318 | if (what == OP_conv) { |
@@ -357,22 +338,22 @@ int dd_main(int argc UNUSED_PARAM, char **argv) | |||
357 | } | 338 | } |
358 | #endif | 339 | #endif |
359 | if (what == OP_bs) { | 340 | if (what == OP_bs) { |
360 | ibs = xatoul_range_sfx(val, 1, ((size_t)-1L)/2, dd_suffixes); | 341 | ibs = xatoul_range_sfx(val, 1, ((size_t)-1L)/2, cwbkMG_suffixes); |
361 | obs = ibs; | 342 | obs = ibs; |
362 | /*continue;*/ | 343 | /*continue;*/ |
363 | } | 344 | } |
364 | /* These can be large: */ | 345 | /* These can be large: */ |
365 | if (what == OP_count) { | 346 | if (what == OP_count) { |
366 | G.flags |= FLAG_COUNT; | 347 | G.flags |= FLAG_COUNT; |
367 | count = XATOU_SFX(val, dd_suffixes); | 348 | count = XATOU_SFX(val, cwbkMG_suffixes); |
368 | /*continue;*/ | 349 | /*continue;*/ |
369 | } | 350 | } |
370 | if (what == OP_seek) { | 351 | if (what == OP_seek) { |
371 | seek = XATOU_SFX(val, dd_suffixes); | 352 | seek = XATOU_SFX(val, cwbkMG_suffixes); |
372 | /*continue;*/ | 353 | /*continue;*/ |
373 | } | 354 | } |
374 | if (what == OP_skip) { | 355 | if (what == OP_skip) { |
375 | skip = XATOU_SFX(val, dd_suffixes); | 356 | skip = XATOU_SFX(val, cwbkMG_suffixes); |
376 | /*continue;*/ | 357 | /*continue;*/ |
377 | } | 358 | } |
378 | if (what == OP_if) { | 359 | if (what == OP_if) { |
diff --git a/coreutils/truncate.c b/coreutils/truncate.c new file mode 100644 index 000000000..0e36daba3 --- /dev/null +++ b/coreutils/truncate.c | |||
@@ -0,0 +1,77 @@ | |||
1 | /* | ||
2 | * Mini truncate implementation for busybox | ||
3 | * | ||
4 | * Copyright (C) 2015 by Ari Sundholm <ari@tuxera.com> | ||
5 | * | ||
6 | * Licensed under GPLv2 or later, see file LICENSE in this source tree. | ||
7 | */ | ||
8 | |||
9 | //config:config TRUNCATE | ||
10 | //config: bool "truncate" | ||
11 | //config: default y | ||
12 | //config: help | ||
13 | //config: truncate truncates files to a given size. If a file does | ||
14 | //config: not exist, it is created unless told otherwise. | ||
15 | |||
16 | //kbuild:lib-$(CONFIG_TRUNCATE) += truncate.o | ||
17 | //applet:IF_TRUNCATE(APPLET_NOFORK(truncate, truncate, BB_DIR_USR_BIN, BB_SUID_DROP, truncate)) | ||
18 | |||
19 | //usage:#define truncate_trivial_usage | ||
20 | //usage: "[-c] -s SIZE FILE..." | ||
21 | //usage:#define truncate_full_usage "\n\n" | ||
22 | //usage: "Truncate FILEs to the given size\n" | ||
23 | //usage: "\n -c Do not create files" | ||
24 | //usage: "\n -s SIZE Truncate to SIZE" | ||
25 | //usage: | ||
26 | //usage:#define truncate_example_usage | ||
27 | //usage: "$ truncate -s 1G foo" | ||
28 | |||
29 | #include "libbb.h" | ||
30 | |||
31 | #if ENABLE_LFS | ||
32 | # define XATOU_SFX xatoull_sfx | ||
33 | #else | ||
34 | # define XATOU_SFX xatoul_sfx | ||
35 | #endif | ||
36 | |||
37 | /* This is a NOFORK applet. Be very careful! */ | ||
38 | |||
39 | int truncate_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | ||
40 | int truncate_main(int argc UNUSED_PARAM, char **argv) | ||
41 | { | ||
42 | unsigned opts; | ||
43 | int flags = O_RDWR; | ||
44 | int ret = EXIT_SUCCESS; | ||
45 | char *size_str; | ||
46 | off_t size; | ||
47 | |||
48 | enum { | ||
49 | OPT_NOCREATE = (1 << 0), | ||
50 | OPT_SIZE = (1 << 1), | ||
51 | }; | ||
52 | |||
53 | opt_complementary = "s:-1"; | ||
54 | opts = getopt32(argv, "cs:", &size_str); | ||
55 | |||
56 | if (!(opts & OPT_NOCREATE)) | ||
57 | flags |= O_CREAT; | ||
58 | |||
59 | // TODO: coreutils 8.17 also support "m" (lowercase) suffix | ||
60 | // with truncate, but not with dd! | ||
61 | // We share kMG_suffixes[], so we can't make both tools | ||
62 | // compatible at once... | ||
63 | size = XATOU_SFX(size_str, kMG_suffixes); | ||
64 | |||
65 | argv += optind; | ||
66 | while (*argv) { | ||
67 | int fd = xopen(*argv, flags); | ||
68 | if (ftruncate(fd, size) == -1) { | ||
69 | bb_perror_msg("%s: ftruncate", *argv); | ||
70 | ret = EXIT_FAILURE; | ||
71 | } | ||
72 | xclose(fd); | ||
73 | ++argv; | ||
74 | } | ||
75 | |||
76 | return ret; | ||
77 | } | ||
diff --git a/include/libbb.h b/include/libbb.h index 1733e9a0f..28ac779c3 100644 --- a/include/libbb.h +++ b/include/libbb.h | |||
@@ -878,6 +878,8 @@ struct suffix_mult { | |||
878 | }; | 878 | }; |
879 | extern const struct suffix_mult bkm_suffixes[]; | 879 | extern const struct suffix_mult bkm_suffixes[]; |
880 | #define km_suffixes (bkm_suffixes + 1) | 880 | #define km_suffixes (bkm_suffixes + 1) |
881 | extern const struct suffix_mult cwbkMG_suffixes[]; | ||
882 | #define kMG_suffixes (cwbkMG_suffixes + 3) | ||
881 | 883 | ||
882 | #include "xatonum.h" | 884 | #include "xatonum.h" |
883 | /* Specialized: */ | 885 | /* Specialized: */ |
diff --git a/libbb/xatonum.c b/libbb/xatonum.c index 6f4e023bb..9dd5c3e7e 100644 --- a/libbb/xatonum.c +++ b/libbb/xatonum.c | |||
@@ -75,3 +75,24 @@ const struct suffix_mult bkm_suffixes[] = { | |||
75 | { "m", 1024*1024 }, | 75 | { "m", 1024*1024 }, |
76 | { "", 0 } | 76 | { "", 0 } |
77 | }; | 77 | }; |
78 | |||
79 | const struct suffix_mult cwbkMG_suffixes[] = { | ||
80 | { "c", 1 }, | ||
81 | { "w", 2 }, | ||
82 | { "b", 512 }, | ||
83 | { "kB", 1000 }, | ||
84 | { "kD", 1000 }, | ||
85 | { "k", 1024 }, | ||
86 | { "KB", 1000 }, /* compat with coreutils dd */ | ||
87 | { "KD", 1000 }, /* compat with coreutils dd */ | ||
88 | { "K", 1024 }, /* compat with coreutils dd */ | ||
89 | { "MB", 1000000 }, | ||
90 | { "MD", 1000000 }, | ||
91 | { "M", 1024*1024 }, | ||
92 | { "GB", 1000000000 }, | ||
93 | { "GD", 1000000000 }, | ||
94 | { "G", 1024*1024*1024 }, | ||
95 | /* "D" suffix for decimal is not in coreutils manpage, looks like it's deprecated */ | ||
96 | /* coreutils also understands TPEZY suffixes for tera- and so on, with B suffix for decimal */ | ||
97 | { "", 0 } | ||
98 | }; | ||
diff --git a/networking/ifupdown.c b/networking/ifupdown.c index daabeec0c..606fc049f 100644 --- a/networking/ifupdown.c +++ b/networking/ifupdown.c | |||
@@ -1239,6 +1239,7 @@ int ifupdown_main(int argc UNUSED_PARAM, char **argv) | |||
1239 | char *pch; | 1239 | char *pch; |
1240 | bool okay = 0; | 1240 | bool okay = 0; |
1241 | int cmds_ret; | 1241 | int cmds_ret; |
1242 | bool curr_failure = 0; | ||
1242 | 1243 | ||
1243 | iface = xstrdup(target_list->data); | 1244 | iface = xstrdup(target_list->data); |
1244 | target_list = target_list->link; | 1245 | target_list = target_list->link; |
@@ -1304,11 +1305,11 @@ int ifupdown_main(int argc UNUSED_PARAM, char **argv) | |||
1304 | /* Call the cmds function pointer, does either iface_up() or iface_down() */ | 1305 | /* Call the cmds function pointer, does either iface_up() or iface_down() */ |
1305 | cmds_ret = cmds(currif); | 1306 | cmds_ret = cmds(currif); |
1306 | if (cmds_ret == -1) { | 1307 | if (cmds_ret == -1) { |
1307 | bb_error_msg("don't seem to have all the variables for %s/%s", | 1308 | bb_error_msg("don't have all variables for %s/%s", |
1308 | liface, currif->address_family->name); | 1309 | liface, currif->address_family->name); |
1309 | any_failures = 1; | 1310 | any_failures = curr_failure = 1; |
1310 | } else if (cmds_ret == 0) { | 1311 | } else if (cmds_ret == 0) { |
1311 | any_failures = 1; | 1312 | any_failures = curr_failure = 1; |
1312 | } | 1313 | } |
1313 | 1314 | ||
1314 | currif->iface = oldiface; | 1315 | currif->iface = oldiface; |
@@ -1329,7 +1330,7 @@ int ifupdown_main(int argc UNUSED_PARAM, char **argv) | |||
1329 | llist_t *state_list = read_iface_state(); | 1330 | llist_t *state_list = read_iface_state(); |
1330 | llist_t *iface_state = find_iface_state(state_list, iface); | 1331 | llist_t *iface_state = find_iface_state(state_list, iface); |
1331 | 1332 | ||
1332 | if (cmds == iface_up && !any_failures) { | 1333 | if (cmds == iface_up && !curr_failure) { |
1333 | char *newiface = xasprintf("%s=%s", iface, liface); | 1334 | char *newiface = xasprintf("%s=%s", iface, liface); |
1334 | if (!iface_state) { | 1335 | if (!iface_state) { |
1335 | llist_add_to_end(&state_list, newiface); | 1336 | llist_add_to_end(&state_list, newiface); |
diff --git a/networking/zcip.c b/networking/zcip.c index a3307c5c9..962ba2e60 100644 --- a/networking/zcip.c +++ b/networking/zcip.c | |||
@@ -521,7 +521,7 @@ int zcip_main(int argc UNUSED_PARAM, char **argv) | |||
521 | target_ip_conflict = 0; | 521 | target_ip_conflict = 0; |
522 | 522 | ||
523 | if (memcmp(&p.arp.arp_sha, ð_addr, ETH_ALEN) != 0) { | 523 | if (memcmp(&p.arp.arp_sha, ð_addr, ETH_ALEN) != 0) { |
524 | if (memcmp(p.arp.arp_spa, &ip.s_addr, sizeof(struct in_addr))) { | 524 | if (memcmp(p.arp.arp_spa, &ip.s_addr, sizeof(struct in_addr)) == 0) { |
525 | /* A probe or reply with source_ip == chosen ip */ | 525 | /* A probe or reply with source_ip == chosen ip */ |
526 | source_ip_conflict = 1; | 526 | source_ip_conflict = 1; |
527 | } | 527 | } |
diff --git a/scripts/trylink b/scripts/trylink index 5da494fbb..48c487bcd 100755 --- a/scripts/trylink +++ b/scripts/trylink | |||
@@ -46,19 +46,19 @@ try() { | |||
46 | } | 46 | } |
47 | 47 | ||
48 | check_cc() { | 48 | check_cc() { |
49 | local tempname="/tmp/temp.$$.$RANDOM" | 49 | local tempname="$(mktemp)" |
50 | # Can use "-o /dev/null", but older gcc tend to *unlink it* on failure! :( | 50 | # Can use "-o /dev/null", but older gcc tend to *unlink it* on failure! :( |
51 | # "-xc": C language. "/dev/null" is an empty source file. | 51 | # "-xc": C language. "/dev/null" is an empty source file. |
52 | if $CC $1 -shared -xc /dev/null -o "$tempname".o >/dev/null 2>&1; then | 52 | if $CC $CPPFLAGS $CFLAGS $1 -shared -xc /dev/null -o "$tempname".o >/dev/null 2>&1; then |
53 | echo "$1"; | 53 | echo "$1"; |
54 | else | 54 | else |
55 | echo "$2"; | 55 | echo "$2"; |
56 | fi | 56 | fi |
57 | rm "$tempname".o 2>/dev/null | 57 | rm -f "$tempname" "$tempname".o |
58 | } | 58 | } |
59 | 59 | ||
60 | check_libc_is_glibc() { | 60 | check_libc_is_glibc() { |
61 | local tempname="/tmp/temp.$$.$RANDOM" | 61 | local tempname="$(mktemp)" |
62 | echo "\ | 62 | echo "\ |
63 | #include <stdlib.h> | 63 | #include <stdlib.h> |
64 | /* Apparently uclibc defines __GLIBC__ (compat trick?). Oh well. */ | 64 | /* Apparently uclibc defines __GLIBC__ (compat trick?). Oh well. */ |
@@ -66,12 +66,12 @@ check_libc_is_glibc() { | |||
66 | syntax error here | 66 | syntax error here |
67 | #endif | 67 | #endif |
68 | " >"$tempname".c | 68 | " >"$tempname".c |
69 | if $CC "$tempname".c -c -o "$tempname".o >/dev/null 2>&1; then | 69 | if $CC $CPPFLAGS $CFLAGS "$tempname".c -c -o "$tempname".o >/dev/null 2>&1; then |
70 | echo "$2"; | 70 | echo "$2"; |
71 | else | 71 | else |
72 | echo "$1"; | 72 | echo "$1"; |
73 | fi | 73 | fi |
74 | rm "$tempname".c "$tempname".o 2>/dev/null | 74 | rm -f "$tempname" "$tempname".[co] |
75 | } | 75 | } |
76 | 76 | ||
77 | EXE="$1" | 77 | EXE="$1" |
diff --git a/shell/ash.c b/shell/ash.c index df7083370..8cc3f0872 100644 --- a/shell/ash.c +++ b/shell/ash.c | |||
@@ -6108,7 +6108,6 @@ exptilde(char *startp, char *p, int flags) | |||
6108 | struct passwd *pw; | 6108 | struct passwd *pw; |
6109 | const char *home; | 6109 | const char *home; |
6110 | int quotes = flags & (EXP_FULL | EXP_CASE | EXP_REDIR); | 6110 | int quotes = flags & (EXP_FULL | EXP_CASE | EXP_REDIR); |
6111 | int startloc; | ||
6112 | 6111 | ||
6113 | name = p + 1; | 6112 | name = p + 1; |
6114 | 6113 | ||
@@ -6140,9 +6139,7 @@ exptilde(char *startp, char *p, int flags) | |||
6140 | if (!home || !*home) | 6139 | if (!home || !*home) |
6141 | goto lose; | 6140 | goto lose; |
6142 | *p = c; | 6141 | *p = c; |
6143 | startloc = expdest - (char *)stackblock(); | ||
6144 | strtodest(home, SQSYNTAX, quotes); | 6142 | strtodest(home, SQSYNTAX, quotes); |
6145 | recordregion(startloc, expdest - (char *)stackblock(), 0); | ||
6146 | return p; | 6143 | return p; |
6147 | lose: | 6144 | lose: |
6148 | *p = c; | 6145 | *p = c; |
diff --git a/sysklogd/logread.c b/sysklogd/logread.c index bea73d932..da4a4d4df 100644 --- a/sysklogd/logread.c +++ b/sysklogd/logread.c | |||
@@ -10,10 +10,11 @@ | |||
10 | */ | 10 | */ |
11 | 11 | ||
12 | //usage:#define logread_trivial_usage | 12 | //usage:#define logread_trivial_usage |
13 | //usage: "[-f]" | 13 | //usage: "[-fF]" |
14 | //usage:#define logread_full_usage "\n\n" | 14 | //usage:#define logread_full_usage "\n\n" |
15 | //usage: "Show messages in syslogd's circular buffer\n" | 15 | //usage: "Show messages in syslogd's circular buffer\n" |
16 | //usage: "\n -f Output data as log grows" | 16 | //usage: "\n -f Output data as log grows" |
17 | //usage: "\n -F Same as -f, but dump buffer first" | ||
17 | 18 | ||
18 | #include "libbb.h" | 19 | #include "libbb.h" |
19 | #include <sys/ipc.h> | 20 | #include <sys/ipc.h> |
@@ -83,7 +84,7 @@ int logread_main(int argc UNUSED_PARAM, char **argv) | |||
83 | unsigned cur; | 84 | unsigned cur; |
84 | int log_semid; /* ipc semaphore id */ | 85 | int log_semid; /* ipc semaphore id */ |
85 | int log_shmid; /* ipc shared memory id */ | 86 | int log_shmid; /* ipc shared memory id */ |
86 | smallint follow = getopt32(argv, "f"); | 87 | int follow = getopt32(argv, "fF"); |
87 | 88 | ||
88 | INIT_G(); | 89 | INIT_G(); |
89 | 90 | ||
@@ -106,7 +107,7 @@ int logread_main(int argc UNUSED_PARAM, char **argv) | |||
106 | /* Max possible value for tail is shbuf->size - 1 */ | 107 | /* Max possible value for tail is shbuf->size - 1 */ |
107 | cur = shbuf->tail; | 108 | cur = shbuf->tail; |
108 | 109 | ||
109 | /* Loop for logread -f, one pass if there was no -f */ | 110 | /* Loop for -f or -F, one pass otherwise */ |
110 | do { | 111 | do { |
111 | unsigned shbuf_size; | 112 | unsigned shbuf_size; |
112 | unsigned shbuf_tail; | 113 | unsigned shbuf_tail; |
@@ -129,7 +130,12 @@ int logread_main(int argc UNUSED_PARAM, char **argv) | |||
129 | printf("cur:%u tail:%u size:%u\n", | 130 | printf("cur:%u tail:%u size:%u\n", |
130 | cur, shbuf_tail, shbuf_size); | 131 | cur, shbuf_tail, shbuf_size); |
131 | 132 | ||
132 | if (!follow) { | 133 | if (!(follow & 1)) { /* not -f */ |
134 | /* if -F, "convert" it to -f, so that we dont | ||
135 | * dump the entire buffer on each iteration | ||
136 | */ | ||
137 | follow >>= 1; | ||
138 | |||
133 | /* advance to oldest complete message */ | 139 | /* advance to oldest complete message */ |
134 | /* find NUL */ | 140 | /* find NUL */ |
135 | cur += strlen(shbuf_data + cur); | 141 | cur += strlen(shbuf_data + cur); |
@@ -142,7 +148,7 @@ int logread_main(int argc UNUSED_PARAM, char **argv) | |||
142 | cur++; | 148 | cur++; |
143 | if (cur >= shbuf_size) /* last byte in buffer? */ | 149 | if (cur >= shbuf_size) /* last byte in buffer? */ |
144 | cur = 0; | 150 | cur = 0; |
145 | } else { /* logread -f */ | 151 | } else { /* -f */ |
146 | if (cur == shbuf_tail) { | 152 | if (cur == shbuf_tail) { |
147 | sem_up(log_semid); | 153 | sem_up(log_semid); |
148 | fflush_all(); | 154 | fflush_all(); |