diff options
| author | Ron Yorston <rmy@pobox.com> | 2014-01-13 09:11:24 +0000 |
|---|---|---|
| committer | Ron Yorston <rmy@pobox.com> | 2014-01-13 09:11:24 +0000 |
| commit | e6edcba4f2fc20a3e9db75ebe82d7a71094fe17c (patch) | |
| tree | af786c447cae6ca59e195b31fbae442c0b42d198 | |
| parent | 215f730e98215bff8dfacafdaa70e4a11395ad53 (diff) | |
| parent | 0f592d7fb94c5887528d0ee24020c2225ab71c28 (diff) | |
| download | busybox-w32-e6edcba4f2fc20a3e9db75ebe82d7a71094fe17c.tar.gz busybox-w32-e6edcba4f2fc20a3e9db75ebe82d7a71094fe17c.tar.bz2 busybox-w32-e6edcba4f2fc20a3e9db75ebe82d7a71094fe17c.zip | |
Merge branch 'busybox' into merge
Conflicts:
include/platform.h
scripts/basic/fixdep.c
| -rw-r--r-- | Makefile.help | 4 | ||||
| -rw-r--r-- | archival/libarchive/get_header_tar.c | 4 | ||||
| -rw-r--r-- | archival/libarchive/open_transformer.c | 23 | ||||
| -rw-r--r-- | coreutils/Config.src | 3 | ||||
| -rw-r--r-- | coreutils/chown.c | 2 | ||||
| -rw-r--r-- | coreutils/tail.c | 7 | ||||
| -rw-r--r-- | findutils/find.c | 21 | ||||
| -rw-r--r-- | findutils/grep.c | 28 | ||||
| -rw-r--r-- | include/platform.h | 28 | ||||
| -rw-r--r-- | libbb/lineedit.c | 2 | ||||
| -rw-r--r-- | libbb/speed_table.c | 5 | ||||
| -rw-r--r-- | networking/isrv.h | 26 | ||||
| -rw-r--r-- | networking/isrv_identd.c | 38 | ||||
| -rw-r--r-- | networking/ntpd.c | 2 | ||||
| -rw-r--r-- | networking/ping.c | 19 | ||||
| -rw-r--r-- | scripts/basic/docproc.c | 2 | ||||
| -rw-r--r-- | scripts/basic/fixdep.c | 2 | ||||
| -rwxr-xr-x | scripts/gen_build_files.sh | 14 | ||||
| -rw-r--r-- | shell/ash.c | 2 | ||||
| -rwxr-xr-x | testsuite/find.tests | 22 | ||||
| -rwxr-xr-x | testsuite/grep.tests | 12 |
21 files changed, 191 insertions, 75 deletions
diff --git a/Makefile.help b/Makefile.help index 119dd6f89..6a23e2a80 100644 --- a/Makefile.help +++ b/Makefile.help | |||
| @@ -21,10 +21,6 @@ help: | |||
| 21 | @echo ' defconfig - set .config to largest generic configuration' | 21 | @echo ' defconfig - set .config to largest generic configuration' |
| 22 | @echo ' menuconfig - interactive curses-based configurator' | 22 | @echo ' menuconfig - interactive curses-based configurator' |
| 23 | @echo ' oldconfig - resolve any unresolved symbols in .config' | 23 | @echo ' oldconfig - resolve any unresolved symbols in .config' |
| 24 | @echo ' hosttools - build sed for the host.' | ||
| 25 | @echo ' You can use these commands if the commands on the host' | ||
| 26 | @echo ' is unusable. Afterwards use it like:' | ||
| 27 | @echo ' make SED="$(objtree)/sed"' | ||
| 28 | @$(if $(boards), \ | 24 | @$(if $(boards), \ |
| 29 | $(foreach b, $(boards), \ | 25 | $(foreach b, $(boards), \ |
| 30 | printf " %-21s - Build for %s\\n" $(b) $(subst _defconfig,,$(b));) \ | 26 | printf " %-21s - Build for %s\\n" $(b) $(subst _defconfig,,$(b));) \ |
diff --git a/archival/libarchive/get_header_tar.c b/archival/libarchive/get_header_tar.c index 32f842095..54d910431 100644 --- a/archival/libarchive/get_header_tar.c +++ b/archival/libarchive/get_header_tar.c | |||
| @@ -115,7 +115,9 @@ static void process_pax_hdr(archive_handle_t *archive_handle, unsigned sz, int g | |||
| 115 | */ | 115 | */ |
| 116 | p += len; | 116 | p += len; |
| 117 | sz -= len; | 117 | sz -= len; |
| 118 | if ((int)sz < 0 | 118 | if ( |
| 119 | /** (int)sz < 0 - not good enough for huge malicious VALUE of 2^32-1 */ | ||
| 120 | (int)(sz|len) < 0 /* this works */ | ||
| 119 | || len == 0 | 121 | || len == 0 |
| 120 | || errno != EINVAL | 122 | || errno != EINVAL |
| 121 | || *end != ' ' | 123 | || *end != ' ' |
diff --git a/archival/libarchive/open_transformer.c b/archival/libarchive/open_transformer.c index c4e02f0f7..b11bf46af 100644 --- a/archival/libarchive/open_transformer.c +++ b/archival/libarchive/open_transformer.c | |||
| @@ -184,27 +184,26 @@ int FAST_FUNC setup_unzip_on_fd(int fd, int fail_if_not_detected) | |||
| 184 | 184 | ||
| 185 | int FAST_FUNC open_zipped(const char *fname) | 185 | int FAST_FUNC open_zipped(const char *fname) |
| 186 | { | 186 | { |
| 187 | char *sfx; | ||
| 188 | int fd; | 187 | int fd; |
| 189 | 188 | ||
| 190 | fd = open(fname, O_RDONLY); | 189 | fd = open(fname, O_RDONLY); |
| 191 | if (fd < 0) | 190 | if (fd < 0) |
| 192 | return fd; | 191 | return fd; |
| 193 | 192 | ||
| 194 | sfx = strrchr(fname, '.'); | 193 | if (ENABLE_FEATURE_SEAMLESS_LZMA) { |
| 195 | if (sfx) { | 194 | /* .lzma has no header/signature, can only detect it by extension */ |
| 196 | sfx++; | 195 | char *sfx = strrchr(fname, '.'); |
| 197 | if (ENABLE_FEATURE_SEAMLESS_LZMA && strcmp(sfx, "lzma") == 0) | 196 | if (sfx && strcmp(sfx+1, "lzma") == 0) { |
| 198 | /* .lzma has no header/signature, just trust it */ | ||
| 199 | open_transformer_with_sig(fd, unpack_lzma_stream, "unlzma"); | 197 | open_transformer_with_sig(fd, unpack_lzma_stream, "unlzma"); |
| 200 | else | 198 | return fd; |
| 201 | if ((ENABLE_FEATURE_SEAMLESS_GZ && strcmp(sfx, "gz") == 0) | ||
| 202 | || (ENABLE_FEATURE_SEAMLESS_BZ2 && strcmp(sfx, "bz2") == 0) | ||
| 203 | || (ENABLE_FEATURE_SEAMLESS_XZ && strcmp(sfx, "xz") == 0) | ||
| 204 | ) { | ||
| 205 | setup_unzip_on_fd(fd, /*fail_if_not_detected:*/ 1); | ||
| 206 | } | 199 | } |
| 207 | } | 200 | } |
| 201 | if ((ENABLE_FEATURE_SEAMLESS_GZ) | ||
| 202 | || (ENABLE_FEATURE_SEAMLESS_BZ2) | ||
| 203 | || (ENABLE_FEATURE_SEAMLESS_XZ) | ||
| 204 | ) { | ||
| 205 | setup_unzip_on_fd(fd, /*fail_if_not_detected:*/ 1); | ||
| 206 | } | ||
| 208 | 207 | ||
| 209 | return fd; | 208 | return fd; |
| 210 | } | 209 | } |
diff --git a/coreutils/Config.src b/coreutils/Config.src index b5701217e..ef14be471 100644 --- a/coreutils/Config.src +++ b/coreutils/Config.src | |||
| @@ -635,12 +635,13 @@ config FEATURE_FANCY_TAIL | |||
| 635 | default y | 635 | default y |
| 636 | depends on TAIL | 636 | depends on TAIL |
| 637 | help | 637 | help |
| 638 | The options (-q, -s, and -v) are provided by GNU tail, but | 638 | The options (-q, -s, -v and -F) are provided by GNU tail, but |
| 639 | are not specific in the SUSv3 standard. | 639 | are not specific in the SUSv3 standard. |
| 640 | 640 | ||
| 641 | -q Never output headers giving file names | 641 | -q Never output headers giving file names |
| 642 | -s SEC Wait SEC seconds between reads with -f | 642 | -s SEC Wait SEC seconds between reads with -f |
| 643 | -v Always output headers giving file names | 643 | -v Always output headers giving file names |
| 644 | -F Same as -f, but keep retrying | ||
| 644 | 645 | ||
| 645 | config TEE | 646 | config TEE |
| 646 | bool "tee" | 647 | bool "tee" |
diff --git a/coreutils/chown.c b/coreutils/chown.c index 1a9127622..cb07bbcbb 100644 --- a/coreutils/chown.c +++ b/coreutils/chown.c | |||
| @@ -16,10 +16,10 @@ | |||
| 16 | //usage: "Change the owner and/or group of each FILE to OWNER and/or GROUP\n" | 16 | //usage: "Change the owner and/or group of each FILE to OWNER and/or GROUP\n" |
| 17 | //usage: "\n -R Recurse" | 17 | //usage: "\n -R Recurse" |
| 18 | //usage: "\n -h Affect symlinks instead of symlink targets" | 18 | //usage: "\n -h Affect symlinks instead of symlink targets" |
| 19 | //usage: IF_DESKTOP( | ||
| 19 | //usage: "\n -L Traverse all symlinks to directories" | 20 | //usage: "\n -L Traverse all symlinks to directories" |
| 20 | //usage: "\n -H Traverse symlinks on command line only" | 21 | //usage: "\n -H Traverse symlinks on command line only" |
| 21 | //usage: "\n -P Don't traverse symlinks (default)" | 22 | //usage: "\n -P Don't traverse symlinks (default)" |
| 22 | //usage: IF_DESKTOP( | ||
| 23 | //usage: "\n -c List changed files" | 23 | //usage: "\n -c List changed files" |
| 24 | //usage: "\n -v List all files" | 24 | //usage: "\n -v List all files" |
| 25 | //usage: "\n -f Hide errors" | 25 | //usage: "\n -f Hide errors" |
diff --git a/coreutils/tail.c b/coreutils/tail.c index eab502beb..e352ab627 100644 --- a/coreutils/tail.c +++ b/coreutils/tail.c | |||
| @@ -32,15 +32,14 @@ | |||
| 32 | //usage: "Print last 10 lines of each FILE (or stdin) to stdout.\n" | 32 | //usage: "Print last 10 lines of each FILE (or stdin) to stdout.\n" |
| 33 | //usage: "With more than one FILE, precede each with a filename header.\n" | 33 | //usage: "With more than one FILE, precede each with a filename header.\n" |
| 34 | //usage: "\n -f Print data as file grows" | 34 | //usage: "\n -f Print data as file grows" |
| 35 | //usage: IF_FEATURE_FANCY_TAIL( | 35 | //usage: "\n -c [+]N[kbm] Print last N bytes" |
| 36 | //usage: "\n -s SECONDS Wait SECONDS between reads with -f" | ||
| 37 | //usage: ) | ||
| 38 | //usage: "\n -n N[kbm] Print last N lines" | 36 | //usage: "\n -n N[kbm] Print last N lines" |
| 39 | //usage: "\n -n +N[kbm] Start on Nth line and print the rest" | 37 | //usage: "\n -n +N[kbm] Start on Nth line and print the rest" |
| 40 | //usage: IF_FEATURE_FANCY_TAIL( | 38 | //usage: IF_FEATURE_FANCY_TAIL( |
| 41 | //usage: "\n -c [+]N[kbm] Print last N bytes" | ||
| 42 | //usage: "\n -q Never print headers" | 39 | //usage: "\n -q Never print headers" |
| 40 | //usage: "\n -s SECONDS Wait SECONDS between reads with -f" | ||
| 43 | //usage: "\n -v Always print headers" | 41 | //usage: "\n -v Always print headers" |
| 42 | //usage: "\n -F Same as -f, but keep retrying" | ||
| 44 | //usage: "\n" | 43 | //usage: "\n" |
| 45 | //usage: "\nN may be suffixed by k (x1024), b (x512), or m (x1024^2)." | 44 | //usage: "\nN may be suffixed by k (x1024), b (x512), or m (x1024^2)." |
| 46 | //usage: ) | 45 | //usage: ) |
diff --git a/findutils/find.c b/findutils/find.c index 53d8239c7..5d5e24bfb 100644 --- a/findutils/find.c +++ b/findutils/find.c | |||
| @@ -1291,9 +1291,27 @@ int find_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | |||
| 1291 | int find_main(int argc UNUSED_PARAM, char **argv) | 1291 | int find_main(int argc UNUSED_PARAM, char **argv) |
| 1292 | { | 1292 | { |
| 1293 | int i, firstopt, status = EXIT_SUCCESS; | 1293 | int i, firstopt, status = EXIT_SUCCESS; |
| 1294 | char **past_HLP, *saved; | ||
| 1294 | 1295 | ||
| 1295 | INIT_G(); | 1296 | INIT_G(); |
| 1296 | 1297 | ||
| 1298 | /* "find -type f" + getopt("+HLP") => disaster. | ||
| 1299 | * Need to avoid getopt running into a non-HLP option. | ||
| 1300 | * Do this by temporarily storing NULL there: | ||
| 1301 | */ | ||
| 1302 | past_HLP = argv; | ||
| 1303 | for (;;) { | ||
| 1304 | saved = *++past_HLP; | ||
| 1305 | if (!saved) | ||
| 1306 | break; | ||
| 1307 | if (saved[0] != '-') | ||
| 1308 | break; | ||
| 1309 | if (!saved[1]) | ||
| 1310 | break; /* it is "-" */ | ||
| 1311 | if ((saved+1)[strspn(saved+1, "HLP")] != '\0') | ||
| 1312 | break; | ||
| 1313 | } | ||
| 1314 | *past_HLP = NULL; | ||
| 1297 | /* "+": stop on first non-option */ | 1315 | /* "+": stop on first non-option */ |
| 1298 | i = getopt32(argv, "+HLP"); | 1316 | i = getopt32(argv, "+HLP"); |
| 1299 | if (i & (1<<0)) | 1317 | if (i & (1<<0)) |
| @@ -1301,7 +1319,8 @@ int find_main(int argc UNUSED_PARAM, char **argv) | |||
| 1301 | if (i & (1<<1)) | 1319 | if (i & (1<<1)) |
| 1302 | G.recurse_flags |= ACTION_FOLLOWLINKS | ACTION_DANGLING_OK; | 1320 | G.recurse_flags |= ACTION_FOLLOWLINKS | ACTION_DANGLING_OK; |
| 1303 | /* -P is default and is ignored */ | 1321 | /* -P is default and is ignored */ |
| 1304 | argv += optind; | 1322 | argv = past_HLP; /* same result as "argv += optind;" */ |
| 1323 | *past_HLP = saved; | ||
| 1305 | 1324 | ||
| 1306 | for (firstopt = 0; argv[firstopt]; firstopt++) { | 1325 | for (firstopt = 0; argv[firstopt]; firstopt++) { |
| 1307 | if (argv[firstopt][0] == '-') | 1326 | if (argv[firstopt][0] == '-') |
diff --git a/findutils/grep.c b/findutils/grep.c index 5bbe61100..f5f95cb95 100644 --- a/findutils/grep.c +++ b/findutils/grep.c | |||
| @@ -381,6 +381,9 @@ static int grep_file(FILE *file) | |||
| 381 | opt_f_not_found: ; | 381 | opt_f_not_found: ; |
| 382 | } | 382 | } |
| 383 | } else { | 383 | } else { |
| 384 | #if ENABLE_EXTRA_COMPAT | ||
| 385 | unsigned start_pos; | ||
| 386 | #endif | ||
| 384 | char *match_at; | 387 | char *match_at; |
| 385 | 388 | ||
| 386 | if (!(gl->flg_mem_alocated_compiled & COMPILED)) { | 389 | if (!(gl->flg_mem_alocated_compiled & COMPILED)) { |
| @@ -397,15 +400,18 @@ static int grep_file(FILE *file) | |||
| 397 | #if !ENABLE_EXTRA_COMPAT | 400 | #if !ENABLE_EXTRA_COMPAT |
| 398 | gl->matched_range.rm_so = 0; | 401 | gl->matched_range.rm_so = 0; |
| 399 | gl->matched_range.rm_eo = 0; | 402 | gl->matched_range.rm_eo = 0; |
| 403 | #else | ||
| 404 | start_pos = 0; | ||
| 400 | #endif | 405 | #endif |
| 401 | match_at = line; | 406 | match_at = line; |
| 402 | opt_w_again: | 407 | opt_w_again: |
| 408 | //bb_error_msg("'%s' start_pos:%d line_len:%d", match_at, start_pos, line_len); | ||
| 403 | if ( | 409 | if ( |
| 404 | #if !ENABLE_EXTRA_COMPAT | 410 | #if !ENABLE_EXTRA_COMPAT |
| 405 | regexec(&gl->compiled_regex, match_at, 1, &gl->matched_range, 0) == 0 | 411 | regexec(&gl->compiled_regex, match_at, 1, &gl->matched_range, 0) == 0 |
| 406 | #else | 412 | #else |
| 407 | re_search(&gl->compiled_regex, match_at, line_len, | 413 | re_search(&gl->compiled_regex, match_at, line_len, |
| 408 | /*start:*/ 0, /*range:*/ line_len, | 414 | start_pos, /*range:*/ line_len, |
| 409 | &gl->matched_range) >= 0 | 415 | &gl->matched_range) >= 0 |
| 410 | #endif | 416 | #endif |
| 411 | ) { | 417 | ) { |
| @@ -424,8 +430,24 @@ static int grep_file(FILE *file) | |||
| 424 | if (!c || (!isalnum(c) && c != '_')) { | 430 | if (!c || (!isalnum(c) && c != '_')) { |
| 425 | found = 1; | 431 | found = 1; |
| 426 | } else { | 432 | } else { |
| 427 | match_at += gl->matched_range.rm_eo; | 433 | /* |
| 428 | goto opt_w_again; | 434 | * Why check gl->matched_range.rm_eo? |
| 435 | * Zero-length match makes -w skip the line: | ||
| 436 | * "echo foo | grep ^" prints "foo", | ||
| 437 | * "echo foo | grep -w ^" prints nothing. | ||
| 438 | * Without such check, we can loop forever. | ||
| 439 | */ | ||
| 440 | #if !ENABLE_EXTRA_COMPAT | ||
| 441 | if (gl->matched_range.rm_eo != 0) { | ||
| 442 | match_at += gl->matched_range.rm_eo; | ||
| 443 | goto opt_w_again; | ||
| 444 | } | ||
| 445 | #else | ||
| 446 | if (gl->matched_range.rm_eo > start_pos) { | ||
| 447 | start_pos = gl->matched_range.rm_eo; | ||
| 448 | goto opt_w_again; | ||
| 449 | } | ||
| 450 | #endif | ||
| 429 | } | 451 | } |
| 430 | } | 452 | } |
| 431 | } | 453 | } |
diff --git a/include/platform.h b/include/platform.h index e52dd7ba5..515ef031f 100644 --- a/include/platform.h +++ b/include/platform.h | |||
| @@ -402,10 +402,6 @@ typedef unsigned smalluint; | |||
| 402 | # undef HAVE_STRVERSCMP | 402 | # undef HAVE_STRVERSCMP |
| 403 | #endif | 403 | #endif |
| 404 | 404 | ||
| 405 | #if defined(__dietlibc__) | ||
| 406 | # undef HAVE_STRCHRNUL | ||
| 407 | #endif | ||
| 408 | |||
| 409 | #if ENABLE_PLATFORM_MINGW32 | 405 | #if ENABLE_PLATFORM_MINGW32 |
| 410 | # undef HAVE_DPRINTF | 406 | # undef HAVE_DPRINTF |
| 411 | # undef HAVE_GETLINE | 407 | # undef HAVE_GETLINE |
| @@ -453,7 +449,7 @@ typedef unsigned smalluint; | |||
| 453 | /* These BSD-derived OSes share many similarities */ | 449 | /* These BSD-derived OSes share many similarities */ |
| 454 | #if (defined __digital__ && defined __unix__) \ | 450 | #if (defined __digital__ && defined __unix__) \ |
| 455 | || defined __APPLE__ \ | 451 | || defined __APPLE__ \ |
| 456 | || defined __FreeBSD__ || defined __OpenBSD__ || defined __NetBSD__ | 452 | || defined __OpenBSD__ || defined __NetBSD__ |
| 457 | # undef HAVE_CLEARENV | 453 | # undef HAVE_CLEARENV |
| 458 | # undef HAVE_FDATASYNC | 454 | # undef HAVE_FDATASYNC |
| 459 | # undef HAVE_GETLINE | 455 | # undef HAVE_GETLINE |
| @@ -468,10 +464,30 @@ typedef unsigned smalluint; | |||
| 468 | # undef HAVE_UNLOCKED_LINE_OPS | 464 | # undef HAVE_UNLOCKED_LINE_OPS |
| 469 | #endif | 465 | #endif |
| 470 | 466 | ||
| 471 | #if defined(__FreeBSD__) || defined(__APPLE__) | 467 | #if defined(__dietlibc__) |
| 468 | # undef HAVE_STRCHRNUL | ||
| 469 | #endif | ||
| 470 | |||
| 471 | #if defined(__APPLE__) | ||
| 472 | # undef HAVE_STRCHRNUL | 472 | # undef HAVE_STRCHRNUL |
| 473 | #endif | 473 | #endif |
| 474 | 474 | ||
| 475 | #if defined(__FreeBSD__) | ||
| 476 | # undef HAVE_CLEARENV | ||
| 477 | # undef HAVE_FDATASYNC | ||
| 478 | # undef HAVE_MNTENT_H | ||
| 479 | # undef HAVE_PTSNAME_R | ||
| 480 | # undef HAVE_SYS_STATFS_H | ||
| 481 | # undef HAVE_SIGHANDLER_T | ||
| 482 | # undef HAVE_STRVERSCMP | ||
| 483 | # undef HAVE_XTABS | ||
| 484 | # undef HAVE_UNLOCKED_LINE_OPS | ||
| 485 | # include <osreldate.h> | ||
| 486 | # if __FreeBSD_version < 1000029 | ||
| 487 | # undef HAVE_STRCHRNUL /* FreeBSD added strchrnul() between 1000028 and 1000029 */ | ||
| 488 | # endif | ||
| 489 | #endif | ||
| 490 | |||
| 475 | #if defined(__NetBSD__) | 491 | #if defined(__NetBSD__) |
| 476 | # define HAVE_GETLINE 1 /* Recent NetBSD versions have getline() */ | 492 | # define HAVE_GETLINE 1 /* Recent NetBSD versions have getline() */ |
| 477 | #endif | 493 | #endif |
diff --git a/libbb/lineedit.c b/libbb/lineedit.c index 38d4c598d..4bb1ab783 100644 --- a/libbb/lineedit.c +++ b/libbb/lineedit.c | |||
| @@ -1267,7 +1267,9 @@ line_input_t* FAST_FUNC new_line_input_t(int flags) | |||
| 1267 | { | 1267 | { |
| 1268 | line_input_t *n = xzalloc(sizeof(*n)); | 1268 | line_input_t *n = xzalloc(sizeof(*n)); |
| 1269 | n->flags = flags; | 1269 | n->flags = flags; |
| 1270 | #if MAX_HISTORY > 0 | ||
| 1270 | n->max_history = MAX_HISTORY; | 1271 | n->max_history = MAX_HISTORY; |
| 1272 | #endif | ||
| 1271 | return n; | 1273 | return n; |
| 1272 | } | 1274 | } |
| 1273 | 1275 | ||
diff --git a/libbb/speed_table.c b/libbb/speed_table.c index 45159f1f3..174d531b2 100644 --- a/libbb/speed_table.c +++ b/libbb/speed_table.c | |||
| @@ -10,7 +10,12 @@ | |||
| 10 | #include "libbb.h" | 10 | #include "libbb.h" |
| 11 | 11 | ||
| 12 | struct speed_map { | 12 | struct speed_map { |
| 13 | #if defined __FreeBSD__ | ||
| 14 | /* On FreeBSD, B<num> constants don't fit into a short */ | ||
| 15 | unsigned speed; | ||
| 16 | #else | ||
| 13 | unsigned short speed; | 17 | unsigned short speed; |
| 18 | #endif | ||
| 14 | unsigned short value; | 19 | unsigned short value; |
| 15 | }; | 20 | }; |
| 16 | 21 | ||
diff --git a/networking/isrv.h b/networking/isrv.h index 4c7e01dd1..7b12e0edd 100644 --- a/networking/isrv.h +++ b/networking/isrv.h | |||
| @@ -23,7 +23,31 @@ int isrv_register_fd(isrv_state_t *state, int peer, int fd); | |||
| 23 | void isrv_close_fd(isrv_state_t *state, int fd); | 23 | void isrv_close_fd(isrv_state_t *state, int fd); |
| 24 | int isrv_register_peer(isrv_state_t *state, void *param); | 24 | int isrv_register_peer(isrv_state_t *state, void *param); |
| 25 | 25 | ||
| 26 | /* driver */ | 26 | /* Driver: |
| 27 | * | ||
| 28 | * Select on listen_fd for <linger_timeout> (or forever if 0). | ||
| 29 | * | ||
| 30 | * If we time out and we have no peers, exit. | ||
| 31 | * If we have peers, call do_timeout(peer_param), | ||
| 32 | * if it returns !0, peer is removed. | ||
| 33 | * | ||
| 34 | * If listen_fd is active, accept new connection ("peer"), | ||
| 35 | * call new_peer() on it, and if it returns 0, | ||
| 36 | * add it to fds to select on. | ||
| 37 | * Now, select will wait for <timeout>, not <linger_timeout> | ||
| 38 | * (as long as we have more than zero peers). | ||
| 39 | * | ||
| 40 | * If a peer's fd is active, we call do_rd() on it if read | ||
| 41 | * bit was set, and then do_wr() if write bit was also set. | ||
| 42 | * If either returns !0, peer is removed. | ||
| 43 | * Reaching this place also resets timeout counter for this peer. | ||
| 44 | * | ||
| 45 | * Note that peer must indicate that he wants to be selected | ||
| 46 | * for read and/or write using isrv_want_rd()/isrv_want_wr() | ||
| 47 | * [can be called in new_peer() or in do_rd()/do_wr()]. | ||
| 48 | * If it never wants to be selected for write, do_wr() | ||
| 49 | * will never be called (can be NULL). | ||
| 50 | */ | ||
| 27 | void isrv_run( | 51 | void isrv_run( |
| 28 | int listen_fd, | 52 | int listen_fd, |
| 29 | int (*new_peer)(isrv_state_t *state, int fd), | 53 | int (*new_peer)(isrv_state_t *state, int fd), |
diff --git a/networking/isrv_identd.c b/networking/isrv_identd.c index a41405c33..252c8aba9 100644 --- a/networking/isrv_identd.c +++ b/networking/isrv_identd.c | |||
| @@ -25,8 +25,7 @@ enum { TIMEOUT = 20 }; | |||
| 25 | 25 | ||
| 26 | typedef struct identd_buf_t { | 26 | typedef struct identd_buf_t { |
| 27 | int pos; | 27 | int pos; |
| 28 | int fd_flag; | 28 | char buf[64 - sizeof(int)]; |
| 29 | char buf[64 - 2*sizeof(int)]; | ||
| 30 | } identd_buf_t; | 29 | } identd_buf_t; |
| 31 | 30 | ||
| 32 | #define bogouser bb_common_bufsiz1 | 31 | #define bogouser bb_common_bufsiz1 |
| @@ -42,7 +41,7 @@ static int new_peer(isrv_state_t *state, int fd) | |||
| 42 | if (isrv_register_fd(state, peer, fd) < 0) | 41 | if (isrv_register_fd(state, peer, fd) < 0) |
| 43 | return peer; /* failure, unregister peer */ | 42 | return peer; /* failure, unregister peer */ |
| 44 | 43 | ||
| 45 | buf->fd_flag = fcntl(fd, F_GETFL) | O_NONBLOCK; | 44 | ndelay_on(fd); |
| 46 | isrv_want_rd(state, fd); | 45 | isrv_want_rd(state, fd); |
| 47 | return 0; | 46 | return 0; |
| 48 | } | 47 | } |
| @@ -51,19 +50,16 @@ static int do_rd(int fd, void **paramp) | |||
| 51 | { | 50 | { |
| 52 | identd_buf_t *buf = *paramp; | 51 | identd_buf_t *buf = *paramp; |
| 53 | char *cur, *p; | 52 | char *cur, *p; |
| 54 | int retval = 0; /* session is ok (so far) */ | ||
| 55 | int sz; | 53 | int sz; |
| 56 | 54 | ||
| 57 | cur = buf->buf + buf->pos; | 55 | cur = buf->buf + buf->pos; |
| 58 | 56 | ||
| 59 | if (buf->fd_flag & O_NONBLOCK) | 57 | sz = safe_read(fd, cur, sizeof(buf->buf) - 1 - buf->pos); |
| 60 | fcntl(fd, F_SETFL, buf->fd_flag); | ||
| 61 | sz = safe_read(fd, cur, sizeof(buf->buf) - buf->pos); | ||
| 62 | 58 | ||
| 63 | if (sz < 0) { | 59 | if (sz < 0) { |
| 64 | if (errno != EAGAIN) | 60 | if (errno != EAGAIN) |
| 65 | goto term; /* terminate this session if !EAGAIN */ | 61 | goto term; |
| 66 | goto ok; | 62 | return 0; /* "session is ok" */ |
| 67 | } | 63 | } |
| 68 | 64 | ||
| 69 | buf->pos += sz; | 65 | buf->pos += sz; |
| @@ -71,19 +67,22 @@ static int do_rd(int fd, void **paramp) | |||
| 71 | p = strpbrk(cur, "\r\n"); | 67 | p = strpbrk(cur, "\r\n"); |
| 72 | if (p) | 68 | if (p) |
| 73 | *p = '\0'; | 69 | *p = '\0'; |
| 74 | if (!p && sz && buf->pos <= (int)sizeof(buf->buf)) | 70 | if (!p && sz) |
| 75 | goto ok; | 71 | return 0; /* "session is ok" */ |
| 72 | |||
| 76 | /* Terminate session. If we are in server mode, then | 73 | /* Terminate session. If we are in server mode, then |
| 77 | * fd is still in nonblocking mode - we never block here */ | 74 | * fd is still in nonblocking mode - we never block here */ |
| 78 | if (fd == 0) fd++; /* inetd mode? then write to fd 1 */ | 75 | if (fd == 0) |
| 76 | fd++; /* inetd mode? then write to fd 1 */ | ||
| 79 | fdprintf(fd, "%s : USERID : UNIX : %s\r\n", buf->buf, bogouser); | 77 | fdprintf(fd, "%s : USERID : UNIX : %s\r\n", buf->buf, bogouser); |
| 78 | /* | ||
| 79 | * Why bother if we are going to close fd now anyway? | ||
| 80 | * if (server) | ||
| 81 | * ndelay_off(fd); | ||
| 82 | */ | ||
| 80 | term: | 83 | term: |
| 81 | free(buf); | 84 | free(buf); |
| 82 | retval = 1; /* terminate */ | 85 | return 1; /* "terminate" */ |
| 83 | ok: | ||
| 84 | if (buf->fd_flag & O_NONBLOCK) | ||
| 85 | fcntl(fd, F_SETFL, buf->fd_flag & ~O_NONBLOCK); | ||
| 86 | return retval; | ||
| 87 | } | 86 | } |
| 88 | 87 | ||
| 89 | static int do_timeout(void **paramp UNUSED_PARAM) | 88 | static int do_timeout(void **paramp UNUSED_PARAM) |
| @@ -95,10 +94,9 @@ static void inetd_mode(void) | |||
| 95 | { | 94 | { |
| 96 | identd_buf_t *buf = xzalloc(sizeof(*buf)); | 95 | identd_buf_t *buf = xzalloc(sizeof(*buf)); |
| 97 | /* buf->pos = 0; - xzalloc did it */ | 96 | /* buf->pos = 0; - xzalloc did it */ |
| 98 | /* We do NOT want nonblocking I/O here! */ | ||
| 99 | /* buf->fd_flag = 0; - xzalloc did it */ | ||
| 100 | do | 97 | do |
| 101 | alarm(TIMEOUT); | 98 | alarm(TIMEOUT); |
| 99 | /* Note: we do NOT want nonblocking I/O here! */ | ||
| 102 | while (do_rd(0, (void*)&buf) == 0); | 100 | while (do_rd(0, (void*)&buf) == 0); |
| 103 | } | 101 | } |
| 104 | 102 | ||
| @@ -120,7 +118,7 @@ int fakeidentd_main(int argc UNUSED_PARAM, char **argv) | |||
| 120 | opt = getopt32(argv, "fiwb:", &bind_address); | 118 | opt = getopt32(argv, "fiwb:", &bind_address); |
| 121 | strcpy(bogouser, "nobody"); | 119 | strcpy(bogouser, "nobody"); |
| 122 | if (argv[optind]) | 120 | if (argv[optind]) |
| 123 | strncpy(bogouser, argv[optind], sizeof(bogouser)); | 121 | strncpy(bogouser, argv[optind], sizeof(bogouser) - 1); |
| 124 | 122 | ||
| 125 | /* Daemonize if no -f and no -i and no -w */ | 123 | /* Daemonize if no -f and no -i and no -w */ |
| 126 | if (!(opt & OPT_fiw)) | 124 | if (!(opt & OPT_fiw)) |
diff --git a/networking/ntpd.c b/networking/ntpd.c index ed83415b4..c4b018778 100644 --- a/networking/ntpd.c +++ b/networking/ntpd.c | |||
| @@ -1445,6 +1445,8 @@ update_local_clock(peer_t *p) | |||
| 1445 | 1445 | ||
| 1446 | run_script("step", offset); | 1446 | run_script("step", offset); |
| 1447 | 1447 | ||
| 1448 | recv_time += offset; | ||
| 1449 | |||
| 1448 | #if USING_INITIAL_FREQ_ESTIMATION | 1450 | #if USING_INITIAL_FREQ_ESTIMATION |
| 1449 | if (G.discipline_state == STATE_NSET) { | 1451 | if (G.discipline_state == STATE_NSET) { |
| 1450 | set_new_values(STATE_FREQ, /*offset:*/ 0, recv_time); | 1452 | set_new_values(STATE_FREQ, /*offset:*/ 0, recv_time); |
diff --git a/networking/ping.c b/networking/ping.c index 5d71fe8cc..5e4771f5a 100644 --- a/networking/ping.c +++ b/networking/ping.c | |||
| @@ -168,22 +168,9 @@ create_icmp_socket(void) | |||
| 168 | #endif | 168 | #endif |
| 169 | sock = socket(AF_INET, SOCK_RAW, 1); /* 1 == ICMP */ | 169 | sock = socket(AF_INET, SOCK_RAW, 1); /* 1 == ICMP */ |
| 170 | if (sock < 0) { | 170 | if (sock < 0) { |
| 171 | if (errno != EPERM) | 171 | if (errno == EPERM) |
| 172 | bb_perror_msg_and_die(bb_msg_can_not_create_raw_socket); | 172 | bb_error_msg_and_die(bb_msg_perm_denied_are_you_root); |
| 173 | #if defined(__linux__) || defined(__APPLE__) | 173 | bb_perror_msg_and_die(bb_msg_can_not_create_raw_socket); |
| 174 | /* We don't have root privileges. Try SOCK_DGRAM instead. | ||
| 175 | * Linux needs net.ipv4.ping_group_range for this to work. | ||
| 176 | * MacOSX allows ICMP_ECHO, ICMP_TSTAMP or ICMP_MASKREQ | ||
| 177 | */ | ||
| 178 | #if ENABLE_PING6 | ||
| 179 | if (lsa->u.sa.sa_family == AF_INET6) | ||
| 180 | sock = socket(AF_INET6, SOCK_DGRAM, IPPROTO_ICMPV6); | ||
| 181 | else | ||
| 182 | #endif | ||
| 183 | sock = socket(AF_INET, SOCK_DGRAM, 1); /* 1 == ICMP */ | ||
| 184 | if (sock < 0) | ||
| 185 | #endif | ||
| 186 | bb_error_msg_and_die(bb_msg_perm_denied_are_you_root); | ||
| 187 | } | 174 | } |
| 188 | 175 | ||
| 189 | xmove_fd(sock, pingsock); | 176 | xmove_fd(sock, pingsock); |
diff --git a/scripts/basic/docproc.c b/scripts/basic/docproc.c index b12569832..7f21443c1 100644 --- a/scripts/basic/docproc.c +++ b/scripts/basic/docproc.c | |||
| @@ -39,7 +39,7 @@ | |||
| 39 | #include <limits.h> | 39 | #include <limits.h> |
| 40 | #include <sys/types.h> | 40 | #include <sys/types.h> |
| 41 | #include <sys/wait.h> | 41 | #include <sys/wait.h> |
| 42 | #include <alloca.h> | 42 | //bbox disabled: #include <alloca.h> |
| 43 | 43 | ||
| 44 | /* exitstatus is used to keep track of any failing calls to kernel-doc, | 44 | /* exitstatus is used to keep track of any failing calls to kernel-doc, |
| 45 | * but execution continues. */ | 45 | * but execution continues. */ |
diff --git a/scripts/basic/fixdep.c b/scripts/basic/fixdep.c index b7f9e0c2f..f012551af 100644 --- a/scripts/basic/fixdep.c +++ b/scripts/basic/fixdep.c | |||
| @@ -117,7 +117,7 @@ | |||
| 117 | #ifndef __MINGW32__ | 117 | #ifndef __MINGW32__ |
| 118 | #include <arpa/inet.h> | 118 | #include <arpa/inet.h> |
| 119 | #endif | 119 | #endif |
| 120 | #include <alloca.h> | 120 | //bbox disabled: #include <alloca.h> |
| 121 | 121 | ||
| 122 | /* bbox: not needed | 122 | /* bbox: not needed |
| 123 | #define INT_CONF ntohl(0x434f4e46) | 123 | #define INT_CONF ntohl(0x434f4e46) |
diff --git a/scripts/gen_build_files.sh b/scripts/gen_build_files.sh index 0989b2fe5..e8fa831be 100755 --- a/scripts/gen_build_files.sh +++ b/scripts/gen_build_files.sh | |||
| @@ -31,7 +31,12 @@ generate() | |||
| 31 | # copy stdin to stdout | 31 | # copy stdin to stdout |
| 32 | cat | 32 | cat |
| 33 | # print everything after INSERT line | 33 | # print everything after INSERT line |
| 34 | sed -n '/^INSERT$/ { :l; n; p; bl }' "${src}" | 34 | sed -n '/^INSERT$/ { |
| 35 | :l | ||
| 36 | n | ||
| 37 | p | ||
| 38 | bl | ||
| 39 | }' "${src}" | ||
| 35 | } >"${dst}.tmp" | 40 | } >"${dst}.tmp" |
| 36 | if ! cmp -s "${dst}" "${dst}.tmp"; then | 41 | if ! cmp -s "${dst}" "${dst}.tmp"; then |
| 37 | gen "${dst}" | 42 | gen "${dst}" |
| @@ -52,7 +57,12 @@ sed -n 's@^//applet:@@p' "$srctree"/*/*.c "$srctree"/*/*/*.c \ | |||
| 52 | # We add line continuation backslash after each line, | 57 | # We add line continuation backslash after each line, |
| 53 | # and insert empty line before each line which doesn't start | 58 | # and insert empty line before each line which doesn't start |
| 54 | # with space or tab | 59 | # with space or tab |
| 55 | sed -n -e 's@^//usage:\([ \t].*\)$@\1 \\@p' -e 's@^//usage:\([^ \t].*\)$@\n\1 \\@p' \ | 60 | TAB="$(printf '\tX')" |
| 61 | TAB="${TAB%X}" | ||
| 62 | LF="$(printf '\nX')" | ||
| 63 | LF="${LF%X}" | ||
| 64 | sed -n -e 's@^//usage:\([ '"$TAB"'].*\)$@\1 \\@p' \ | ||
| 65 | -e 's@^//usage:\([^ '"$TAB"'].*\)$@\'"$LF"'\1 \\@p' \ | ||
| 56 | "$srctree"/*/*.c "$srctree"/*/*/*.c \ | 66 | "$srctree"/*/*.c "$srctree"/*/*/*.c \ |
| 57 | | generate \ | 67 | | generate \ |
| 58 | "$srctree/include/usage.src.h" \ | 68 | "$srctree/include/usage.src.h" \ |
diff --git a/shell/ash.c b/shell/ash.c index d104aea1d..a916f2772 100644 --- a/shell/ash.c +++ b/shell/ash.c | |||
| @@ -13616,7 +13616,7 @@ init(void) | |||
| 13616 | setvar2("PPID", utoa(getppid())); | 13616 | setvar2("PPID", utoa(getppid())); |
| 13617 | #if ENABLE_ASH_BASH_COMPAT | 13617 | #if ENABLE_ASH_BASH_COMPAT |
| 13618 | p = lookupvar("SHLVL"); | 13618 | p = lookupvar("SHLVL"); |
| 13619 | setvar2("SHLVL", utoa(p ? atoi(p) + 1 : 1)); | 13619 | setvar("SHLVL", utoa((p ? atoi(p) : 0) + 1), VEXPORT); |
| 13620 | #endif | 13620 | #endif |
| 13621 | p = lookupvar("PWD"); | 13621 | p = lookupvar("PWD"); |
| 13622 | if (p) { | 13622 | if (p) { |
diff --git a/testsuite/find.tests b/testsuite/find.tests new file mode 100755 index 000000000..345d1e82e --- /dev/null +++ b/testsuite/find.tests | |||
| @@ -0,0 +1,22 @@ | |||
| 1 | #!/bin/sh | ||
| 2 | |||
| 3 | # Copyright 2014 by Denys Vlasenko <vda.linux@googlemail.com> | ||
| 4 | # Licensed under GPLv2, see file LICENSE in this source tree. | ||
| 5 | |||
| 6 | . ./testing.sh | ||
| 7 | |||
| 8 | # testing "description" "command" "result" "infile" "stdin" | ||
| 9 | |||
| 10 | mkdir -p find.tempdir | ||
| 11 | touch find.tempdir/testfile | ||
| 12 | |||
| 13 | testing "find -type f" \ | ||
| 14 | "cd find.tempdir && find -type f 2>&1" \ | ||
| 15 | "./testfile\n" \ | ||
| 16 | "" "" | ||
| 17 | |||
| 18 | # testing "description" "command" "result" "infile" "stdin" | ||
| 19 | |||
| 20 | rm -rf find.tempdir | ||
| 21 | |||
| 22 | exit $FAILCOUNT | ||
diff --git a/testsuite/grep.tests b/testsuite/grep.tests index 64d99a905..412efffbb 100755 --- a/testsuite/grep.tests +++ b/testsuite/grep.tests | |||
| @@ -147,6 +147,18 @@ testing "grep -w doesn't stop on 1st mismatch" \ | |||
| 147 | "foop foo\n" \ | 147 | "foop foo\n" \ |
| 148 | "" | 148 | "" |
| 149 | 149 | ||
| 150 | testing "grep -w ^str doesn't match str not at the beginning" \ | ||
| 151 | "grep -w ^str input" \ | ||
| 152 | "" \ | ||
| 153 | "strstr\n" \ | ||
| 154 | "" | ||
| 155 | |||
| 156 | testing "grep -w ^ doesn't hang" \ | ||
| 157 | "grep -w ^ input" \ | ||
| 158 | "" \ | ||
| 159 | "anything\n" \ | ||
| 160 | "" | ||
| 161 | |||
| 150 | # testing "test name" "commands" "expected result" "file input" "stdin" | 162 | # testing "test name" "commands" "expected result" "file input" "stdin" |
| 151 | # file input will be file called "input" | 163 | # file input will be file called "input" |
| 152 | # test can create a file "actual" instead of writing to stdout | 164 | # test can create a file "actual" instead of writing to stdout |
