diff options
| author | Ron Yorston <rmy@pobox.com> | 2018-10-08 08:31:11 +0100 |
|---|---|---|
| committer | Ron Yorston <rmy@pobox.com> | 2018-10-08 08:31:11 +0100 |
| commit | eee3722fd32c8c0929cfbacdbe0b6524e1fd645c (patch) | |
| tree | c9026160e56f204c42029c705d1d16cecd515244 | |
| parent | 25a1bcec7637e0f0c75d3ae6c09eb78fdb6f0a75 (diff) | |
| parent | 349d72c19ced4fae64e8fdd5792b37e78ac2f616 (diff) | |
| download | busybox-w32-eee3722fd32c8c0929cfbacdbe0b6524e1fd645c.tar.gz busybox-w32-eee3722fd32c8c0929cfbacdbe0b6524e1fd645c.tar.bz2 busybox-w32-eee3722fd32c8c0929cfbacdbe0b6524e1fd645c.zip | |
Merge branch 'busybox' into merge
| -rw-r--r-- | .gitignore | 6 | ||||
| -rw-r--r-- | archival/unzip.c | 57 | ||||
| -rw-r--r-- | coreutils/ls.c | 4 | ||||
| -rw-r--r-- | docs/mdev.txt | 6 | ||||
| -rw-r--r-- | e2fsprogs/tune2fs.c | 17 | ||||
| -rw-r--r-- | editors/sed.c | 29 | ||||
| -rw-r--r-- | include/libbb.h | 20 | ||||
| -rw-r--r-- | init/init.c | 9 | ||||
| -rw-r--r-- | libbb/lineedit.c | 2 | ||||
| -rw-r--r-- | libbb/printable_string.c | 7 | ||||
| -rw-r--r-- | libbb/time.c | 14 | ||||
| -rw-r--r-- | libbb/unicode.c | 2 | ||||
| -rw-r--r-- | networking/ifupdown.c | 16 | ||||
| -rw-r--r-- | networking/ntpd.c | 11 | ||||
| -rw-r--r-- | networking/udhcp/d6_dhcpc.c | 8 | ||||
| -rw-r--r-- | networking/udhcp/dhcpc.c | 8 | ||||
| -rwxr-xr-x | testsuite/head.tests | 41 | ||||
| -rw-r--r-- | testsuite/head/head-n-works | 4 | ||||
| -rw-r--r-- | testsuite/head/head-works | 4 | ||||
| -rw-r--r-- | util-linux/fdisk_gpt.c | 2 | ||||
| -rw-r--r-- | util-linux/mkfs_ext2.c | 17 | ||||
| -rw-r--r-- | util-linux/mkfs_reiser.c | 16 | ||||
| -rw-r--r-- | util-linux/mkfs_vfat.c | 13 |
23 files changed, 185 insertions, 128 deletions
diff --git a/.gitignore b/.gitignore index eeb5c2182..517e750c1 100644 --- a/.gitignore +++ b/.gitignore | |||
| @@ -52,3 +52,9 @@ cscope.files | |||
| 52 | cscope.in.out | 52 | cscope.in.out |
| 53 | cscope.out | 53 | cscope.out |
| 54 | cscope.po.out | 54 | cscope.po.out |
| 55 | |||
| 56 | # | ||
| 57 | # ctags output | ||
| 58 | # | ||
| 59 | tags | ||
| 60 | TAGS | ||
diff --git a/archival/unzip.c b/archival/unzip.c index a9b7dc10f..473cbe2ec 100644 --- a/archival/unzip.c +++ b/archival/unzip.c | |||
| @@ -156,15 +156,15 @@ typedef union { | |||
| 156 | #define FIX_ENDIANNESS_CDF(cdf) \ | 156 | #define FIX_ENDIANNESS_CDF(cdf) \ |
| 157 | do { if (BB_BIG_ENDIAN) { \ | 157 | do { if (BB_BIG_ENDIAN) { \ |
| 158 | (cdf).fmt.version_made_by = SWAP_LE16((cdf).fmt.version_made_by); \ | 158 | (cdf).fmt.version_made_by = SWAP_LE16((cdf).fmt.version_made_by); \ |
| 159 | (cdf).fmt.version_needed = SWAP_LE16((cdf).fmt.version_needed); \ | 159 | (cdf).fmt.version_needed = SWAP_LE16((cdf).fmt.version_needed ); \ |
| 160 | (cdf).fmt.method = SWAP_LE16((cdf).fmt.method ); \ | 160 | (cdf).fmt.method = SWAP_LE16((cdf).fmt.method ); \ |
| 161 | (cdf).fmt.modtime = SWAP_LE16((cdf).fmt.modtime ); \ | 161 | (cdf).fmt.modtime = SWAP_LE16((cdf).fmt.modtime ); \ |
| 162 | (cdf).fmt.moddate = SWAP_LE16((cdf).fmt.moddate ); \ | 162 | (cdf).fmt.moddate = SWAP_LE16((cdf).fmt.moddate ); \ |
| 163 | (cdf).fmt.crc32 = SWAP_LE32((cdf).fmt.crc32 ); \ | 163 | (cdf).fmt.crc32 = SWAP_LE32((cdf).fmt.crc32 ); \ |
| 164 | (cdf).fmt.cmpsize = SWAP_LE32((cdf).fmt.cmpsize ); \ | 164 | (cdf).fmt.cmpsize = SWAP_LE32((cdf).fmt.cmpsize ); \ |
| 165 | (cdf).fmt.ucmpsize = SWAP_LE32((cdf).fmt.ucmpsize ); \ | 165 | (cdf).fmt.ucmpsize = SWAP_LE32((cdf).fmt.ucmpsize ); \ |
| 166 | (cdf).fmt.filename_len = SWAP_LE16((cdf).fmt.filename_len); \ | 166 | (cdf).fmt.filename_len = SWAP_LE16((cdf).fmt.filename_len ); \ |
| 167 | (cdf).fmt.extra_len = SWAP_LE16((cdf).fmt.extra_len ); \ | 167 | (cdf).fmt.extra_len = SWAP_LE16((cdf).fmt.extra_len ); \ |
| 168 | (cdf).fmt.file_comment_length = SWAP_LE16((cdf).fmt.file_comment_length); \ | 168 | (cdf).fmt.file_comment_length = SWAP_LE16((cdf).fmt.file_comment_length); \ |
| 169 | (cdf).fmt.external_attributes = SWAP_LE32((cdf).fmt.external_attributes); \ | 169 | (cdf).fmt.external_attributes = SWAP_LE32((cdf).fmt.external_attributes); \ |
| 170 | }} while (0) | 170 | }} while (0) |
| @@ -459,7 +459,9 @@ static int get_lstat_mode(const char *dst_fn) | |||
| 459 | struct stat stat_buf; | 459 | struct stat stat_buf; |
| 460 | if (lstat(dst_fn, &stat_buf) == -1) { | 460 | if (lstat(dst_fn, &stat_buf) == -1) { |
| 461 | if (errno != ENOENT) { | 461 | if (errno != ENOENT) { |
| 462 | bb_perror_msg_and_die("can't stat '%s'", dst_fn); | 462 | bb_perror_msg_and_die("can't stat '%s'", |
| 463 | dst_fn | ||
| 464 | ); | ||
| 463 | } | 465 | } |
| 464 | /* File does not exist */ | 466 | /* File does not exist */ |
| 465 | return -1; | 467 | return -1; |
| @@ -637,7 +639,9 @@ int unzip_main(int argc, char **argv) | |||
| 637 | break; | 639 | break; |
| 638 | if (++i > 2) { | 640 | if (++i > 2) { |
| 639 | *ext = '\0'; | 641 | *ext = '\0'; |
| 640 | bb_error_msg_and_die("can't open %s[.zip]", src_fn); | 642 | bb_error_msg_and_die("can't open %s[.zip]", |
| 643 | src_fn | ||
| 644 | ); | ||
| 641 | } | 645 | } |
| 642 | strcpy(ext, extn[i - 1]); | 646 | strcpy(ext, extn[i - 1]); |
| 643 | } | 647 | } |
| @@ -649,8 +653,11 @@ int unzip_main(int argc, char **argv) | |||
| 649 | xchdir(base_dir); | 653 | xchdir(base_dir); |
| 650 | 654 | ||
| 651 | if (quiet <= 1) { /* not -qq */ | 655 | if (quiet <= 1) { /* not -qq */ |
| 652 | if (quiet == 0) | 656 | if (quiet == 0) { |
| 653 | printf("Archive: %s\n", src_fn); | 657 | printf("Archive: %s\n", |
| 658 | printable_string(src_fn) | ||
| 659 | ); | ||
| 660 | } | ||
| 654 | if (opts & OPT_l) { | 661 | if (opts & OPT_l) { |
| 655 | puts(verbose ? | 662 | puts(verbose ? |
| 656 | " Length Method Size Cmpr Date Time CRC-32 Name\n" | 663 | " Length Method Size Cmpr Date Time CRC-32 Name\n" |
| @@ -834,7 +841,8 @@ int unzip_main(int argc, char **argv) | |||
| 834 | printf( "%9u " "%s " "%s\n", | 841 | printf( "%9u " "%s " "%s\n", |
| 835 | (unsigned)zip.fmt.ucmpsize, | 842 | (unsigned)zip.fmt.ucmpsize, |
| 836 | dtbuf, | 843 | dtbuf, |
| 837 | dst_fn); | 844 | printable_string(dst_fn) |
| 845 | ); | ||
| 838 | } else { | 846 | } else { |
| 839 | char method6[7]; | 847 | char method6[7]; |
| 840 | unsigned long percents; | 848 | unsigned long percents; |
| @@ -863,7 +871,8 @@ int unzip_main(int argc, char **argv) | |||
| 863 | (unsigned)percents, | 871 | (unsigned)percents, |
| 864 | dtbuf, | 872 | dtbuf, |
| 865 | zip.fmt.crc32, | 873 | zip.fmt.crc32, |
| 866 | dst_fn); | 874 | printable_string(dst_fn) |
| 875 | ); | ||
| 867 | total_size += zip.fmt.cmpsize; | 876 | total_size += zip.fmt.cmpsize; |
| 868 | } | 877 | } |
| 869 | total_usize += zip.fmt.ucmpsize; | 878 | total_usize += zip.fmt.ucmpsize; |
| @@ -889,7 +898,7 @@ int unzip_main(int argc, char **argv) | |||
| 889 | mode = get_lstat_mode(dst_fn); | 898 | mode = get_lstat_mode(dst_fn); |
| 890 | if (mode == -1) { /* ENOENT */ | 899 | if (mode == -1) { /* ENOENT */ |
| 891 | if (!quiet) { | 900 | if (!quiet) { |
| 892 | printf(" creating: %s\n", dst_fn); | 901 | printf(" creating: %s\n", printable_string(dst_fn)); |
| 893 | } | 902 | } |
| 894 | unzip_create_leading_dirs(dst_fn); | 903 | unzip_create_leading_dirs(dst_fn); |
| 895 | if (bb_make_directory(dst_fn, dir_mode, FILEUTILS_IGNORE_CHMOD_ERR)) { | 904 | if (bb_make_directory(dst_fn, dir_mode, FILEUTILS_IGNORE_CHMOD_ERR)) { |
| @@ -898,7 +907,9 @@ int unzip_main(int argc, char **argv) | |||
| 898 | } else { | 907 | } else { |
| 899 | if (!S_ISDIR(mode)) { | 908 | if (!S_ISDIR(mode)) { |
| 900 | bb_error_msg_and_die("'%s' exists but is not a %s", | 909 | bb_error_msg_and_die("'%s' exists but is not a %s", |
| 901 | dst_fn, "directory"); | 910 | printable_string(dst_fn), |
| 911 | "directory" | ||
| 912 | ); | ||
| 902 | } | 913 | } |
| 903 | } | 914 | } |
| 904 | goto skip_cmpsize; | 915 | goto skip_cmpsize; |
| @@ -917,12 +928,16 @@ int unzip_main(int argc, char **argv) | |||
| 917 | if (!S_ISREG(mode)) { | 928 | if (!S_ISREG(mode)) { |
| 918 | fishy: | 929 | fishy: |
| 919 | bb_error_msg_and_die("'%s' exists but is not a %s", | 930 | bb_error_msg_and_die("'%s' exists but is not a %s", |
| 920 | dst_fn, "regular file"); | 931 | printable_string(dst_fn), |
| 932 | "regular file" | ||
| 933 | ); | ||
| 921 | } | 934 | } |
| 922 | if (overwrite == O_ALWAYS) { | 935 | if (overwrite == O_ALWAYS) { |
| 923 | goto do_open_and_extract; | 936 | goto do_open_and_extract; |
| 924 | } | 937 | } |
| 925 | printf("replace %s? [y]es, [n]o, [A]ll, [N]one, [r]ename: ", dst_fn); | 938 | printf("replace %s? [y]es, [n]o, [A]ll, [N]one, [r]ename: ", |
| 939 | printable_string(dst_fn) | ||
| 940 | ); | ||
| 926 | my_fgets80(key_buf); | 941 | my_fgets80(key_buf); |
| 927 | /* User input could take a long time. Is it still a regular file? */ | 942 | /* User input could take a long time. Is it still a regular file? */ |
| 928 | mode = get_lstat_mode(dst_fn); | 943 | mode = get_lstat_mode(dst_fn); |
| @@ -952,7 +967,9 @@ int unzip_main(int argc, char **argv) | |||
| 952 | if (!quiet) { | 967 | if (!quiet) { |
| 953 | printf(/* zip.fmt.method == 0 | 968 | printf(/* zip.fmt.method == 0 |
| 954 | ? " extracting: %s\n" | 969 | ? " extracting: %s\n" |
| 955 | : */ " inflating: %s\n", dst_fn); | 970 | : */ " inflating: %s\n", |
| 971 | printable_string(dst_fn) | ||
| 972 | ); | ||
| 956 | } | 973 | } |
| 957 | #if ENABLE_FEATURE_UNZIP_CDF | 974 | #if ENABLE_FEATURE_UNZIP_CDF |
| 958 | if (S_ISLNK(file_mode)) { | 975 | if (S_ISLNK(file_mode)) { |
diff --git a/coreutils/ls.c b/coreutils/ls.c index 9daa15470..fb4f998be 100644 --- a/coreutils/ls.c +++ b/coreutils/ls.c | |||
| @@ -421,7 +421,7 @@ static unsigned calc_name_len(const char *name) | |||
| 421 | uni_stat_t uni_stat; | 421 | uni_stat_t uni_stat; |
| 422 | 422 | ||
| 423 | // TODO: quote tab as \t, etc, if -Q | 423 | // TODO: quote tab as \t, etc, if -Q |
| 424 | name = printable_string(&uni_stat, name); | 424 | name = printable_string2(&uni_stat, name); |
| 425 | 425 | ||
| 426 | if (!(option_mask32 & OPT_Q)) { | 426 | if (!(option_mask32 & OPT_Q)) { |
| 427 | return uni_stat.unicode_width; | 427 | return uni_stat.unicode_width; |
| @@ -450,7 +450,7 @@ static unsigned print_name(const char *name) | |||
| 450 | uni_stat_t uni_stat; | 450 | uni_stat_t uni_stat; |
| 451 | 451 | ||
| 452 | // TODO: quote tab as \t, etc, if -Q | 452 | // TODO: quote tab as \t, etc, if -Q |
| 453 | name = printable_string(&uni_stat, name); | 453 | name = printable_string2(&uni_stat, name); |
| 454 | 454 | ||
| 455 | if (!(option_mask32 & OPT_Q)) { | 455 | if (!(option_mask32 & OPT_Q)) { |
| 456 | fputs(name, stdout); | 456 | fputs(name, stdout); |
diff --git a/docs/mdev.txt b/docs/mdev.txt index b24025f7b..b13a0bb93 100644 --- a/docs/mdev.txt +++ b/docs/mdev.txt | |||
| @@ -60,9 +60,9 @@ or | |||
| 60 | For example: | 60 | For example: |
| 61 | hd[a-z][0-9]* 0:3 660 | 61 | hd[a-z][0-9]* 0:3 660 |
| 62 | 62 | ||
| 63 | The config file parsing stops at the first matching line. If no line is | 63 | The config file parsing stops at the first matching line unless this line |
| 64 | matched, then the default of 0:0 660 is used. To set your own default, simply | 64 | starts with "-". If no line is matched, then the default of 0:0 660 is used. |
| 65 | create your own total match like so: | 65 | To set your own default, simply create your own total match like so: |
| 66 | 66 | ||
| 67 | .* 1:1 777 | 67 | .* 1:1 777 |
| 68 | 68 | ||
diff --git a/e2fsprogs/tune2fs.c b/e2fsprogs/tune2fs.c index a1caf011c..f7fcd88bf 100644 --- a/e2fsprogs/tune2fs.c +++ b/e2fsprogs/tune2fs.c | |||
| @@ -39,23 +39,6 @@ | |||
| 39 | #include <linux/fs.h> | 39 | #include <linux/fs.h> |
| 40 | #include "bb_e2fs_defs.h" | 40 | #include "bb_e2fs_defs.h" |
| 41 | 41 | ||
| 42 | // storage helpers | ||
| 43 | char BUG_wrong_field_size(void); | ||
| 44 | #define STORE_LE(field, value) \ | ||
| 45 | do { \ | ||
| 46 | if (sizeof(field) == 4) \ | ||
| 47 | field = SWAP_LE32(value); \ | ||
| 48 | else if (sizeof(field) == 2) \ | ||
| 49 | field = SWAP_LE16(value); \ | ||
| 50 | else if (sizeof(field) == 1) \ | ||
| 51 | field = (value); \ | ||
| 52 | else \ | ||
| 53 | BUG_wrong_field_size(); \ | ||
| 54 | } while (0) | ||
| 55 | |||
| 56 | #define FETCH_LE32(field) \ | ||
| 57 | (sizeof(field) == 4 ? SWAP_LE32(field) : BUG_wrong_field_size()) | ||
| 58 | |||
| 59 | enum { | 42 | enum { |
| 60 | OPT_L = 1 << 0, // label | 43 | OPT_L = 1 << 0, // label |
| 61 | OPT_c = 1 << 1, // max mount count | 44 | OPT_c = 1 << 1, // max mount count |
diff --git a/editors/sed.c b/editors/sed.c index bf8a11613..fd56e0e7f 100644 --- a/editors/sed.c +++ b/editors/sed.c | |||
| @@ -186,18 +186,23 @@ static void sed_free_and_close_stuff(void) | |||
| 186 | if (sed_cmd->sw_file) | 186 | if (sed_cmd->sw_file) |
| 187 | fclose(sed_cmd->sw_file); | 187 | fclose(sed_cmd->sw_file); |
| 188 | 188 | ||
| 189 | if (sed_cmd->beg_match) { | 189 | /* Used to free regexps, but now there is code |
| 190 | regfree(sed_cmd->beg_match); | 190 | * in get_address() which can reuse a regexp |
| 191 | free(sed_cmd->beg_match); | 191 | * for constructs as /regexp/cmd1;//cmd2 |
| 192 | } | 192 | * leading to double-frees here: |
| 193 | if (sed_cmd->end_match) { | 193 | */ |
| 194 | regfree(sed_cmd->end_match); | 194 | //if (sed_cmd->beg_match) { |
| 195 | free(sed_cmd->end_match); | 195 | // regfree(sed_cmd->beg_match); |
| 196 | } | 196 | // free(sed_cmd->beg_match); |
| 197 | if (sed_cmd->sub_match) { | 197 | //} |
| 198 | regfree(sed_cmd->sub_match); | 198 | //if (sed_cmd->end_match) { |
| 199 | free(sed_cmd->sub_match); | 199 | // regfree(sed_cmd->end_match); |
| 200 | } | 200 | // free(sed_cmd->end_match); |
| 201 | //} | ||
| 202 | //if (sed_cmd->sub_match) { | ||
| 203 | // regfree(sed_cmd->sub_match); | ||
| 204 | // free(sed_cmd->sub_match); | ||
| 205 | //} | ||
| 201 | free(sed_cmd->string); | 206 | free(sed_cmd->string); |
| 202 | free(sed_cmd); | 207 | free(sed_cmd); |
| 203 | sed_cmd = sed_cmd_next; | 208 | sed_cmd = sed_cmd_next; |
diff --git a/include/libbb.h b/include/libbb.h index 0d09fef66..0a333dca8 100644 --- a/include/libbb.h +++ b/include/libbb.h | |||
| @@ -874,7 +874,8 @@ typedef struct uni_stat_t { | |||
| 874 | } uni_stat_t; | 874 | } uni_stat_t; |
| 875 | /* Returns a string with unprintable chars replaced by '?' or | 875 | /* Returns a string with unprintable chars replaced by '?' or |
| 876 | * SUBST_WCHAR. This function is unicode-aware. */ | 876 | * SUBST_WCHAR. This function is unicode-aware. */ |
| 877 | const char* FAST_FUNC printable_string(uni_stat_t *stats, const char *str); | 877 | const char* FAST_FUNC printable_string(const char *str); |
| 878 | const char* FAST_FUNC printable_string2(uni_stat_t *stats, const char *str); | ||
| 878 | /* Prints unprintable char ch as ^C or M-c to file | 879 | /* Prints unprintable char ch as ^C or M-c to file |
| 879 | * (M-c is used only if ch is ORed with PRINTABLE_META), | 880 | * (M-c is used only if ch is ORed with PRINTABLE_META), |
| 880 | * else it is printed as-is (except for ch = 0x9b) */ | 881 | * else it is printed as-is (except for ch = 0x9b) */ |
| @@ -2194,6 +2195,23 @@ extern const char bb_default_login_shell[] ALIGN1; | |||
| 2194 | # define FB_0 "/dev/fb0" | 2195 | # define FB_0 "/dev/fb0" |
| 2195 | #endif | 2196 | #endif |
| 2196 | 2197 | ||
| 2198 | // storage helpers for mk*fs utilities | ||
| 2199 | char BUG_wrong_field_size(void); | ||
| 2200 | #define STORE_LE(field, value) \ | ||
| 2201 | do { \ | ||
| 2202 | if (sizeof(field) == 4) \ | ||
| 2203 | field = SWAP_LE32((uint32_t)(value)); \ | ||
| 2204 | else if (sizeof(field) == 2) \ | ||
| 2205 | field = SWAP_LE16((uint16_t)(value)); \ | ||
| 2206 | else if (sizeof(field) == 1) \ | ||
| 2207 | field = (uint8_t)(value); \ | ||
| 2208 | else \ | ||
| 2209 | BUG_wrong_field_size(); \ | ||
| 2210 | } while (0) | ||
| 2211 | |||
| 2212 | #define FETCH_LE32(field) \ | ||
| 2213 | (sizeof(field) == 4 ? SWAP_LE32(field) : BUG_wrong_field_size()) | ||
| 2214 | |||
| 2197 | 2215 | ||
| 2198 | #define ARRAY_SIZE(x) ((unsigned)(sizeof(x) / sizeof((x)[0]))) | 2216 | #define ARRAY_SIZE(x) ((unsigned)(sizeof(x) / sizeof((x)[0]))) |
| 2199 | #define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)])) | 2217 | #define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)])) |
diff --git a/init/init.c b/init/init.c index 6439e2bcd..fde35f6b6 100644 --- a/init/init.c +++ b/init/init.c | |||
| @@ -752,8 +752,13 @@ static void pause_and_low_level_reboot(unsigned magic) | |||
| 752 | reboot(magic); | 752 | reboot(magic); |
| 753 | _exit(EXIT_SUCCESS); | 753 | _exit(EXIT_SUCCESS); |
| 754 | } | 754 | } |
| 755 | while (1) | 755 | /* Used to have "while (1) sleep(1)" here. |
| 756 | sleep(1); | 756 | * However, in containers reboot() call is ignored, and with that loop |
| 757 | * we would eternally sleep here - not what we want. | ||
| 758 | */ | ||
| 759 | waitpid(pid, NULL, 0); | ||
| 760 | sleep(1); /* paranoia */ | ||
| 761 | _exit(EXIT_SUCCESS); | ||
| 757 | } | 762 | } |
| 758 | 763 | ||
| 759 | static void run_shutdown_and_kill_processes(void) | 764 | static void run_shutdown_and_kill_processes(void) |
diff --git a/libbb/lineedit.c b/libbb/lineedit.c index 6ecf01765..19b579782 100644 --- a/libbb/lineedit.c +++ b/libbb/lineedit.c | |||
| @@ -1139,7 +1139,7 @@ static void showfiles(void) | |||
| 1139 | ); | 1139 | ); |
| 1140 | } | 1140 | } |
| 1141 | if (ENABLE_UNICODE_SUPPORT) | 1141 | if (ENABLE_UNICODE_SUPPORT) |
| 1142 | puts(printable_string(NULL, matches[n])); | 1142 | puts(printable_string(matches[n])); |
| 1143 | else | 1143 | else |
| 1144 | puts(matches[n]); | 1144 | puts(matches[n]); |
| 1145 | } | 1145 | } |
diff --git a/libbb/printable_string.c b/libbb/printable_string.c index e638a178e..2e8895a4f 100644 --- a/libbb/printable_string.c +++ b/libbb/printable_string.c | |||
| @@ -9,7 +9,7 @@ | |||
| 9 | #include "libbb.h" | 9 | #include "libbb.h" |
| 10 | #include "unicode.h" | 10 | #include "unicode.h" |
| 11 | 11 | ||
| 12 | const char* FAST_FUNC printable_string(uni_stat_t *stats, const char *str) | 12 | const char* FAST_FUNC printable_string2(uni_stat_t *stats, const char *str) |
| 13 | { | 13 | { |
| 14 | char *dst; | 14 | char *dst; |
| 15 | const char *s; | 15 | const char *s; |
| @@ -55,3 +55,8 @@ const char* FAST_FUNC printable_string(uni_stat_t *stats, const char *str) | |||
| 55 | #endif | 55 | #endif |
| 56 | return auto_string(dst); | 56 | return auto_string(dst); |
| 57 | } | 57 | } |
| 58 | |||
| 59 | const char* FAST_FUNC printable_string(const char *str) | ||
| 60 | { | ||
| 61 | return printable_string2(NULL, str); | ||
| 62 | } | ||
diff --git a/libbb/time.c b/libbb/time.c index 82e6cb172..f9b8da0b3 100644 --- a/libbb/time.c +++ b/libbb/time.c | |||
| @@ -184,6 +184,7 @@ void FAST_FUNC parse_datestr(const char *date_str, struct tm *ptm) | |||
| 184 | ptm->tm_year -= 1900; /* Adjust years */ | 184 | ptm->tm_year -= 1900; /* Adjust years */ |
| 185 | ptm->tm_mon -= 1; /* Adjust month from 1-12 to 0-11 */ | 185 | ptm->tm_mon -= 1; /* Adjust month from 1-12 to 0-11 */ |
| 186 | } else { | 186 | } else { |
| 187 | err: | ||
| 187 | bb_error_msg_and_die(bb_msg_invalid_date, date_str); | 188 | bb_error_msg_and_die(bb_msg_invalid_date, date_str); |
| 188 | } | 189 | } |
| 189 | ptm->tm_sec = 0; /* assume zero if [.SS] is not given */ | 190 | ptm->tm_sec = 0; /* assume zero if [.SS] is not given */ |
| @@ -194,6 +195,19 @@ void FAST_FUNC parse_datestr(const char *date_str, struct tm *ptm) | |||
| 194 | end = '\0'; | 195 | end = '\0'; |
| 195 | /* else end != NUL and we error out */ | 196 | /* else end != NUL and we error out */ |
| 196 | } | 197 | } |
| 198 | /* Users were confused by "date -s 20180923" | ||
| 199 | * working (not in the way they were expecting). | ||
| 200 | * It was interpreted as MMDDhhmm, and not bothered by | ||
| 201 | * "month #20" in the least. Prevent such cases: | ||
| 202 | */ | ||
| 203 | if (ptm->tm_sec > 60 /* allow "23:60" leap second */ | ||
| 204 | || ptm->tm_min > 59 | ||
| 205 | || ptm->tm_hour > 23 | ||
| 206 | || ptm->tm_mday > 31 | ||
| 207 | || ptm->tm_mon > 11 /* month# is 0..11, not 1..12 */ | ||
| 208 | ) { | ||
| 209 | goto err; | ||
| 210 | } | ||
| 197 | } | 211 | } |
| 198 | if (end != '\0') { | 212 | if (end != '\0') { |
| 199 | bb_error_msg_and_die(bb_msg_invalid_date, date_str); | 213 | bb_error_msg_and_die(bb_msg_invalid_date, date_str); |
diff --git a/libbb/unicode.c b/libbb/unicode.c index d378175a4..89d42179b 100644 --- a/libbb/unicode.c +++ b/libbb/unicode.c | |||
| @@ -996,7 +996,7 @@ size_t FAST_FUNC unicode_strlen(const char *string) | |||
| 996 | size_t FAST_FUNC unicode_strwidth(const char *string) | 996 | size_t FAST_FUNC unicode_strwidth(const char *string) |
| 997 | { | 997 | { |
| 998 | uni_stat_t uni_stat; | 998 | uni_stat_t uni_stat; |
| 999 | printable_string(&uni_stat, string); | 999 | printable_string2(&uni_stat, string); |
| 1000 | return uni_stat.unicode_width; | 1000 | return uni_stat.unicode_width; |
| 1001 | } | 1001 | } |
| 1002 | 1002 | ||
diff --git a/networking/ifupdown.c b/networking/ifupdown.c index 5481134e5..80fce87a6 100644 --- a/networking/ifupdown.c +++ b/networking/ifupdown.c | |||
| @@ -1022,6 +1022,22 @@ static struct interfaces_file_t *read_interfaces(const char *filename, struct in | |||
| 1022 | currently_processing = NONE; | 1022 | currently_processing = NONE; |
| 1023 | } else if (strcmp(first_word, "source") == 0) { | 1023 | } else if (strcmp(first_word, "source") == 0) { |
| 1024 | read_interfaces(next_word(&rest_of_line), defn); | 1024 | read_interfaces(next_word(&rest_of_line), defn); |
| 1025 | } else if (is_prefixed_with(first_word, "source-dir")) { | ||
| 1026 | const char *dirpath; | ||
| 1027 | DIR *dir; | ||
| 1028 | struct dirent *entry; | ||
| 1029 | |||
| 1030 | dirpath = next_word(&rest_of_line); | ||
| 1031 | dir = xopendir(dirpath); | ||
| 1032 | while ((entry = readdir(dir)) != NULL) { | ||
| 1033 | char *path; | ||
| 1034 | if (entry->d_name[0] == '.') | ||
| 1035 | continue; | ||
| 1036 | path = concat_path_file(dirpath, entry->d_name); | ||
| 1037 | read_interfaces(path, defn); | ||
| 1038 | free(path); | ||
| 1039 | } | ||
| 1040 | closedir(dir); | ||
| 1025 | } else { | 1041 | } else { |
| 1026 | switch (currently_processing) { | 1042 | switch (currently_processing) { |
| 1027 | case IFACE: | 1043 | case IFACE: |
diff --git a/networking/ntpd.c b/networking/ntpd.c index 991c518f6..1ebdc34c3 100644 --- a/networking/ntpd.c +++ b/networking/ntpd.c | |||
| @@ -1116,20 +1116,25 @@ fit(peer_t *p, double rd) | |||
| 1116 | { | 1116 | { |
| 1117 | if ((p->reachable_bits & (p->reachable_bits-1)) == 0) { | 1117 | if ((p->reachable_bits & (p->reachable_bits-1)) == 0) { |
| 1118 | /* One or zero bits in reachable_bits */ | 1118 | /* One or zero bits in reachable_bits */ |
| 1119 | VERB4 bb_error_msg("peer %s unfit for selection: unreachable", p->p_dotted); | 1119 | VERB4 bb_error_msg("peer %s unfit for selection: " |
| 1120 | "unreachable", p->p_dotted); | ||
| 1120 | return 0; | 1121 | return 0; |
| 1121 | } | 1122 | } |
| 1122 | #if 0 /* we filter out such packets earlier */ | 1123 | #if 0 /* we filter out such packets earlier */ |
| 1123 | if ((p->lastpkt_status & LI_ALARM) == LI_ALARM | 1124 | if ((p->lastpkt_status & LI_ALARM) == LI_ALARM |
| 1124 | || p->lastpkt_stratum >= MAXSTRAT | 1125 | || p->lastpkt_stratum >= MAXSTRAT |
| 1125 | ) { | 1126 | ) { |
| 1126 | VERB4 bb_error_msg("peer %s unfit for selection: bad status/stratum", p->p_dotted); | 1127 | VERB4 bb_error_msg("peer %s unfit for selection: " |
| 1128 | "bad status/stratum", p->p_dotted); | ||
| 1127 | return 0; | 1129 | return 0; |
| 1128 | } | 1130 | } |
| 1129 | #endif | 1131 | #endif |
| 1130 | /* rd is root_distance(p) */ | 1132 | /* rd is root_distance(p) */ |
| 1131 | if (rd > MAXDIST + FREQ_TOLERANCE * (1 << G.poll_exp)) { | 1133 | if (rd > MAXDIST + FREQ_TOLERANCE * (1 << G.poll_exp)) { |
| 1132 | VERB4 bb_error_msg("peer %s unfit for selection: root distance too high", p->p_dotted); | 1134 | VERB3 bb_error_msg("peer %s unfit for selection: " |
| 1135 | "root distance %f too high, jitter:%f", | ||
| 1136 | p->p_dotted, rd, p->filter_jitter | ||
| 1137 | ); | ||
| 1133 | return 0; | 1138 | return 0; |
| 1134 | } | 1139 | } |
| 1135 | //TODO | 1140 | //TODO |
diff --git a/networking/udhcp/d6_dhcpc.c b/networking/udhcp/d6_dhcpc.c index ed2255ef3..66e4b6c6a 100644 --- a/networking/udhcp/d6_dhcpc.c +++ b/networking/udhcp/d6_dhcpc.c | |||
| @@ -1405,7 +1405,7 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv) | |||
| 1405 | case RENEW_REQUESTED: /* manual (SIGUSR1) renew */ | 1405 | case RENEW_REQUESTED: /* manual (SIGUSR1) renew */ |
| 1406 | case_RENEW_REQUESTED: | 1406 | case_RENEW_REQUESTED: |
| 1407 | case RENEWING: | 1407 | case RENEWING: |
| 1408 | if (timeout > 60) { | 1408 | if (timeout >= 60) { |
| 1409 | /* send an unicast renew request */ | 1409 | /* send an unicast renew request */ |
| 1410 | /* Sometimes observed to fail (EADDRNOTAVAIL) to bind | 1410 | /* Sometimes observed to fail (EADDRNOTAVAIL) to bind |
| 1411 | * a new UDP socket for sending inside send_renew. | 1411 | * a new UDP socket for sending inside send_renew. |
| @@ -1465,11 +1465,9 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv) | |||
| 1465 | * For the second case, must make sure timeout | 1465 | * For the second case, must make sure timeout |
| 1466 | * is not too big, or else we can send | 1466 | * is not too big, or else we can send |
| 1467 | * futile renew requests for hours. | 1467 | * futile renew requests for hours. |
| 1468 | * (Ab)use -A TIMEOUT value (usually 20 sec) | ||
| 1469 | * as a cap on the timeout. | ||
| 1470 | */ | 1468 | */ |
| 1471 | if (timeout > tryagain_timeout) | 1469 | if (timeout > 60) |
| 1472 | timeout = tryagain_timeout; | 1470 | timeout = 60; |
| 1473 | goto case_RENEW_REQUESTED; | 1471 | goto case_RENEW_REQUESTED; |
| 1474 | } | 1472 | } |
| 1475 | /* Start things over */ | 1473 | /* Start things over */ |
diff --git a/networking/udhcp/dhcpc.c b/networking/udhcp/dhcpc.c index 0310663e0..ab3e5a463 100644 --- a/networking/udhcp/dhcpc.c +++ b/networking/udhcp/dhcpc.c | |||
| @@ -1519,7 +1519,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv) | |||
| 1519 | case RENEW_REQUESTED: /* manual (SIGUSR1) renew */ | 1519 | case RENEW_REQUESTED: /* manual (SIGUSR1) renew */ |
| 1520 | case_RENEW_REQUESTED: | 1520 | case_RENEW_REQUESTED: |
| 1521 | case RENEWING: | 1521 | case RENEWING: |
| 1522 | if (timeout > 60) { | 1522 | if (timeout >= 60) { |
| 1523 | /* send an unicast renew request */ | 1523 | /* send an unicast renew request */ |
| 1524 | /* Sometimes observed to fail (EADDRNOTAVAIL) to bind | 1524 | /* Sometimes observed to fail (EADDRNOTAVAIL) to bind |
| 1525 | * a new UDP socket for sending inside send_renew. | 1525 | * a new UDP socket for sending inside send_renew. |
| @@ -1592,11 +1592,9 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv) | |||
| 1592 | * For the second case, must make sure timeout | 1592 | * For the second case, must make sure timeout |
| 1593 | * is not too big, or else we can send | 1593 | * is not too big, or else we can send |
| 1594 | * futile renew requests for hours. | 1594 | * futile renew requests for hours. |
| 1595 | * (Ab)use -A TIMEOUT value (usually 20 sec) | ||
| 1596 | * as a cap on the timeout. | ||
| 1597 | */ | 1595 | */ |
| 1598 | if (timeout > tryagain_timeout) | 1596 | if (timeout > 60) |
| 1599 | timeout = tryagain_timeout; | 1597 | timeout = 60; |
| 1600 | goto case_RENEW_REQUESTED; | 1598 | goto case_RENEW_REQUESTED; |
| 1601 | } | 1599 | } |
| 1602 | /* Start things over */ | 1600 | /* Start things over */ |
diff --git a/testsuite/head.tests b/testsuite/head.tests new file mode 100755 index 000000000..50660d267 --- /dev/null +++ b/testsuite/head.tests | |||
| @@ -0,0 +1,41 @@ | |||
| 1 | #!/bin/sh | ||
| 2 | # Copyright 2018 Thomas De Schampheleire <thomas.de_schampheleire@nokia.com> | ||
| 3 | # Licensed under GPLv2 or later, see file LICENSE in this source tree. | ||
| 4 | |||
| 5 | . ./testing.sh | ||
| 6 | |||
| 7 | # testing "test name" "command" "expected result" "file input" "stdin" | ||
| 8 | |||
| 9 | cat <<EOF > head.input | ||
| 10 | line 1 | ||
| 11 | line 2 | ||
| 12 | line 3 | ||
| 13 | line 4 | ||
| 14 | line 5 | ||
| 15 | line 6 | ||
| 16 | line 7 | ||
| 17 | line 8 | ||
| 18 | line 9 | ||
| 19 | line 10 | ||
| 20 | line 11 | ||
| 21 | line 12 | ||
| 22 | EOF | ||
| 23 | |||
| 24 | testing "head (without args)" \ | ||
| 25 | "head head.input" \ | ||
| 26 | "line 1\nline 2\nline 3\nline 4\nline 5\nline 6\nline 7\nline 8\nline 9\nline 10\n" \ | ||
| 27 | "" "" | ||
| 28 | |||
| 29 | testing "head -n <positive number>" \ | ||
| 30 | "head -n 2 head.input" \ | ||
| 31 | "line 1\nline 2\n" \ | ||
| 32 | "" "" | ||
| 33 | |||
| 34 | testing "head -n <negative number>" \ | ||
| 35 | "head -n -9 head.input" \ | ||
| 36 | "line 1\nline 2\nline 3\n" \ | ||
| 37 | "" "" | ||
| 38 | |||
| 39 | rm head.input | ||
| 40 | |||
| 41 | exit $FAILCOUNT | ||
diff --git a/testsuite/head/head-n-works b/testsuite/head/head-n-works deleted file mode 100644 index db4325556..000000000 --- a/testsuite/head/head-n-works +++ /dev/null | |||
| @@ -1,4 +0,0 @@ | |||
| 1 | [ -n "$d" ] || d=.. | ||
| 2 | head -n 2 "$d/README" > logfile.gnu | ||
| 3 | busybox head -n 2 "$d/README" > logfile.bb | ||
| 4 | cmp logfile.gnu logfile.bb | ||
diff --git a/testsuite/head/head-works b/testsuite/head/head-works deleted file mode 100644 index 56ad3e36b..000000000 --- a/testsuite/head/head-works +++ /dev/null | |||
| @@ -1,4 +0,0 @@ | |||
| 1 | [ -n "$d" ] || d=.. | ||
| 2 | head "$d/README" > logfile.gnu | ||
| 3 | busybox head "$d/README" > logfile.bb | ||
| 4 | cmp logfile.gnu logfile.bb | ||
diff --git a/util-linux/fdisk_gpt.c b/util-linux/fdisk_gpt.c index cdb90627d..dbe889f7c 100644 --- a/util-linux/fdisk_gpt.c +++ b/util-linux/fdisk_gpt.c | |||
| @@ -87,7 +87,7 @@ gpt_print_wide36(uint16_t *s) | |||
| 87 | } | 87 | } |
| 88 | wc[i] = 0; | 88 | wc[i] = 0; |
| 89 | if (wcstombs(buf, wc, sizeof(buf)) <= sizeof(buf)-1) | 89 | if (wcstombs(buf, wc, sizeof(buf)) <= sizeof(buf)-1) |
| 90 | fputs(printable_string(NULL, buf), stdout); | 90 | fputs(printable_string(buf), stdout); |
| 91 | #else | 91 | #else |
| 92 | char buf[37]; | 92 | char buf[37]; |
| 93 | int i = 0; | 93 | int i = 0; |
diff --git a/util-linux/mkfs_ext2.c b/util-linux/mkfs_ext2.c index f524bc239..bda168f1e 100644 --- a/util-linux/mkfs_ext2.c +++ b/util-linux/mkfs_ext2.c | |||
| @@ -78,23 +78,6 @@ | |||
| 78 | #define EXT2_FLAGS_SIGNED_HASH 0x0001 | 78 | #define EXT2_FLAGS_SIGNED_HASH 0x0001 |
| 79 | #define EXT2_FLAGS_UNSIGNED_HASH 0x0002 | 79 | #define EXT2_FLAGS_UNSIGNED_HASH 0x0002 |
| 80 | 80 | ||
| 81 | // storage helpers | ||
| 82 | char BUG_wrong_field_size(void); | ||
| 83 | #define STORE_LE(field, value) \ | ||
| 84 | do { \ | ||
| 85 | if (sizeof(field) == 4) \ | ||
| 86 | field = SWAP_LE32((uint32_t)(value)); \ | ||
| 87 | else if (sizeof(field) == 2) \ | ||
| 88 | field = SWAP_LE16((uint16_t)(value)); \ | ||
| 89 | else if (sizeof(field) == 1) \ | ||
| 90 | field = (uint8_t)(value); \ | ||
| 91 | else \ | ||
| 92 | BUG_wrong_field_size(); \ | ||
| 93 | } while (0) | ||
| 94 | |||
| 95 | #define FETCH_LE32(field) \ | ||
| 96 | (sizeof(field) == 4 ? SWAP_LE32(field) : BUG_wrong_field_size()) | ||
| 97 | |||
| 98 | // All fields are little-endian | 81 | // All fields are little-endian |
| 99 | struct ext2_dir { | 82 | struct ext2_dir { |
| 100 | uint32_t inode1; | 83 | uint32_t inode1; |
diff --git a/util-linux/mkfs_reiser.c b/util-linux/mkfs_reiser.c index 390aef86c..b4c8dda6f 100644 --- a/util-linux/mkfs_reiser.c +++ b/util-linux/mkfs_reiser.c | |||
| @@ -28,22 +28,6 @@ | |||
| 28 | #include "libbb.h" | 28 | #include "libbb.h" |
| 29 | #include <linux/fs.h> | 29 | #include <linux/fs.h> |
| 30 | 30 | ||
| 31 | char BUG_wrong_field_size(void); | ||
| 32 | #define STORE_LE(field, value) \ | ||
| 33 | do { \ | ||
| 34 | if (sizeof(field) == 4) \ | ||
| 35 | field = SWAP_LE32(value); \ | ||
| 36 | else if (sizeof(field) == 2) \ | ||
| 37 | field = SWAP_LE16(value); \ | ||
| 38 | else if (sizeof(field) == 1) \ | ||
| 39 | field = (value); \ | ||
| 40 | else \ | ||
| 41 | BUG_wrong_field_size(); \ | ||
| 42 | } while (0) | ||
| 43 | |||
| 44 | #define FETCH_LE32(field) \ | ||
| 45 | (sizeof(field) == 4 ? SWAP_LE32(field) : BUG_wrong_field_size()) | ||
| 46 | |||
| 47 | struct journal_params { | 31 | struct journal_params { |
| 48 | uint32_t jp_journal_1st_block; /* where does journal start from on its device */ | 32 | uint32_t jp_journal_1st_block; /* where does journal start from on its device */ |
| 49 | uint32_t jp_journal_dev; /* journal device st_rdev */ | 33 | uint32_t jp_journal_dev; /* journal device st_rdev */ |
diff --git a/util-linux/mkfs_vfat.c b/util-linux/mkfs_vfat.c index 92f0e3b1a..6a6dc652f 100644 --- a/util-linux/mkfs_vfat.c +++ b/util-linux/mkfs_vfat.c | |||
| @@ -206,19 +206,6 @@ static const char boot_code[] ALIGN1 = | |||
| 206 | #define MARK_CLUSTER(cluster, value) \ | 206 | #define MARK_CLUSTER(cluster, value) \ |
| 207 | ((uint32_t *)fat)[cluster] = SWAP_LE32(value) | 207 | ((uint32_t *)fat)[cluster] = SWAP_LE32(value) |
| 208 | 208 | ||
| 209 | void BUG_unsupported_field_size(void); | ||
| 210 | #define STORE_LE(field, value) \ | ||
| 211 | do { \ | ||
| 212 | if (sizeof(field) == 4) \ | ||
| 213 | field = SWAP_LE32((uint32_t)(value)); \ | ||
| 214 | else if (sizeof(field) == 2) \ | ||
| 215 | field = SWAP_LE16((uint16_t)(value)); \ | ||
| 216 | else if (sizeof(field) == 1) \ | ||
| 217 | field = (uint8_t)(value); \ | ||
| 218 | else \ | ||
| 219 | BUG_unsupported_field_size(); \ | ||
| 220 | } while (0) | ||
| 221 | |||
| 222 | /* compat: | 209 | /* compat: |
| 223 | * mkdosfs 2.11 (12 Mar 2005) | 210 | * mkdosfs 2.11 (12 Mar 2005) |
| 224 | * Usage: mkdosfs [-A] [-c] [-C] [-v] [-I] [-l bad-block-file] | 211 | * Usage: mkdosfs [-A] [-c] [-C] [-v] [-I] [-l bad-block-file] |
