diff options
author | Ron Yorston <rmy@pobox.com> | 2023-06-16 13:02:47 +0100 |
---|---|---|
committer | Ron Yorston <rmy@pobox.com> | 2023-06-16 13:02:47 +0100 |
commit | 4b3d7e62cff6015e1c4b856165efd90cf9182a5c (patch) | |
tree | 0a59c6a94a47c3e8f1a47b0a3218f9591b842385 /shell | |
parent | 0627e352656effac8d8e617378e7a68edfce41df (diff) | |
parent | 2ca39ffd447ca874fcea933194829717d5573247 (diff) | |
download | busybox-w32-4b3d7e62cff6015e1c4b856165efd90cf9182a5c.tar.gz busybox-w32-4b3d7e62cff6015e1c4b856165efd90cf9182a5c.tar.bz2 busybox-w32-4b3d7e62cff6015e1c4b856165efd90cf9182a5c.zip |
Merge branch 'busybox' into merge
Diffstat (limited to 'shell')
-rw-r--r-- | shell/ash_test/ash-misc/elif1.right | 4 | ||||
-rwxr-xr-x | shell/ash_test/ash-misc/elif1.tests | 6 | ||||
-rw-r--r-- | shell/ash_test/ash-misc/elif2.right | 2 | ||||
-rwxr-xr-x | shell/ash_test/ash-misc/elif2.tests | 8 | ||||
-rw-r--r-- | shell/hush.c | 31 | ||||
-rw-r--r-- | shell/hush_test/hush-misc/elif1.right | 4 | ||||
-rwxr-xr-x | shell/hush_test/hush-misc/elif1.tests | 6 | ||||
-rw-r--r-- | shell/hush_test/hush-misc/elif2.right | 2 | ||||
-rwxr-xr-x | shell/hush_test/hush-misc/elif2.tests | 8 |
9 files changed, 63 insertions, 8 deletions
diff --git a/shell/ash_test/ash-misc/elif1.right b/shell/ash_test/ash-misc/elif1.right new file mode 100644 index 000000000..36dc59fed --- /dev/null +++ b/shell/ash_test/ash-misc/elif1.right | |||
@@ -0,0 +1,4 @@ | |||
1 | ELIF1 | ||
2 | ELIF2 | ||
3 | ELIF THEN | ||
4 | Ok:0 | ||
diff --git a/shell/ash_test/ash-misc/elif1.tests b/shell/ash_test/ash-misc/elif1.tests new file mode 100755 index 000000000..77b8a25ea --- /dev/null +++ b/shell/ash_test/ash-misc/elif1.tests | |||
@@ -0,0 +1,6 @@ | |||
1 | if false; then | ||
2 | : | ||
3 | elif echo 'ELIF1'; echo 'ELIF2'; then | ||
4 | echo "ELIF THEN" | ||
5 | fi | ||
6 | echo "Ok:$?" | ||
diff --git a/shell/ash_test/ash-misc/elif2.right b/shell/ash_test/ash-misc/elif2.right new file mode 100644 index 000000000..8f2851f91 --- /dev/null +++ b/shell/ash_test/ash-misc/elif2.right | |||
@@ -0,0 +1,2 @@ | |||
1 | THEN | ||
2 | Ok:0 | ||
diff --git a/shell/ash_test/ash-misc/elif2.tests b/shell/ash_test/ash-misc/elif2.tests new file mode 100755 index 000000000..3e5876f05 --- /dev/null +++ b/shell/ash_test/ash-misc/elif2.tests | |||
@@ -0,0 +1,8 @@ | |||
1 | if true; then | ||
2 | echo "THEN" | ||
3 | elif echo "ELIF false"; false; then | ||
4 | echo "ELIF THEN" | ||
5 | else | ||
6 | echo "ELSE" | ||
7 | fi | ||
8 | echo "Ok:$?" | ||
diff --git a/shell/hush.c b/shell/hush.c index 810dafd35..cdaa67a3b 100644 --- a/shell/hush.c +++ b/shell/hush.c | |||
@@ -1061,6 +1061,7 @@ static int builtin_export(char **argv) FAST_FUNC; | |||
1061 | #if ENABLE_HUSH_READONLY | 1061 | #if ENABLE_HUSH_READONLY |
1062 | static int builtin_readonly(char **argv) FAST_FUNC; | 1062 | static int builtin_readonly(char **argv) FAST_FUNC; |
1063 | #endif | 1063 | #endif |
1064 | static int builtin_false(char **argv) FAST_FUNC; | ||
1064 | #if ENABLE_HUSH_JOB | 1065 | #if ENABLE_HUSH_JOB |
1065 | static int builtin_fg_bg(char **argv) FAST_FUNC; | 1066 | static int builtin_fg_bg(char **argv) FAST_FUNC; |
1066 | static int builtin_jobs(char **argv) FAST_FUNC; | 1067 | static int builtin_jobs(char **argv) FAST_FUNC; |
@@ -1161,6 +1162,7 @@ static const struct built_in_command bltins1[] ALIGN_PTR = { | |||
1161 | #if ENABLE_HUSH_EXPORT | 1162 | #if ENABLE_HUSH_EXPORT |
1162 | BLTIN("export" , builtin_export , "Set environment variables"), | 1163 | BLTIN("export" , builtin_export , "Set environment variables"), |
1163 | #endif | 1164 | #endif |
1165 | BLTIN("false" , builtin_false , NULL), | ||
1164 | #if ENABLE_HUSH_JOB | 1166 | #if ENABLE_HUSH_JOB |
1165 | BLTIN("fg" , builtin_fg_bg , "Bring job to foreground"), | 1167 | BLTIN("fg" , builtin_fg_bg , "Bring job to foreground"), |
1166 | #endif | 1168 | #endif |
@@ -9758,7 +9760,7 @@ static int run_list(struct pipe *pi) | |||
9758 | smallint last_rword; /* ditto */ | 9760 | smallint last_rword; /* ditto */ |
9759 | #endif | 9761 | #endif |
9760 | 9762 | ||
9761 | debug_printf_exec("run_list start lvl %d\n", G.run_list_level); | 9763 | debug_printf_exec("run_list lvl %d start\n", G.run_list_level); |
9762 | debug_enter(); | 9764 | debug_enter(); |
9763 | 9765 | ||
9764 | #if ENABLE_HUSH_LOOPS | 9766 | #if ENABLE_HUSH_LOOPS |
@@ -9817,7 +9819,7 @@ static int run_list(struct pipe *pi) | |||
9817 | break; | 9819 | break; |
9818 | 9820 | ||
9819 | IF_HAS_KEYWORDS(rword = pi->res_word;) | 9821 | IF_HAS_KEYWORDS(rword = pi->res_word;) |
9820 | debug_printf_exec(": rword=%d cond_code=%d last_rword=%d\n", | 9822 | debug_printf_exec(": rword:%d cond_code:%d last_rword:%d\n", |
9821 | rword, cond_code, last_rword); | 9823 | rword, cond_code, last_rword); |
9822 | 9824 | ||
9823 | sv_errexit_depth = G.errexit_depth; | 9825 | sv_errexit_depth = G.errexit_depth; |
@@ -9851,23 +9853,29 @@ static int run_list(struct pipe *pi) | |||
9851 | } | 9853 | } |
9852 | } | 9854 | } |
9853 | last_followup = pi->followup; | 9855 | last_followup = pi->followup; |
9854 | IF_HAS_KEYWORDS(last_rword = rword;) | ||
9855 | #if ENABLE_HUSH_IF | 9856 | #if ENABLE_HUSH_IF |
9856 | if (cond_code) { | 9857 | if (cond_code != 0) { |
9857 | if (rword == RES_THEN) { | 9858 | if (rword == RES_THEN) { |
9858 | /* if false; then ... fi has exitcode 0! */ | 9859 | /* if false; then ... fi has exitcode 0! */ |
9859 | G.last_exitcode = rcode = EXIT_SUCCESS; | 9860 | G.last_exitcode = rcode = EXIT_SUCCESS; |
9860 | /* "if <false> THEN cmd": skip cmd */ | 9861 | /* "if <false> THEN cmd": skip cmd */ |
9862 | debug_printf_exec("skipped THEN cmd because IF condition was false\n"); | ||
9863 | last_rword = rword; | ||
9861 | continue; | 9864 | continue; |
9862 | } | 9865 | } |
9863 | } else { | 9866 | } else { |
9864 | if (rword == RES_ELSE || rword == RES_ELIF) { | 9867 | if (rword == RES_ELSE |
9868 | || (rword == RES_ELIF && last_rword != RES_ELIF) | ||
9869 | ) { | ||
9865 | /* "if <true> then ... ELSE/ELIF cmd": | 9870 | /* "if <true> then ... ELSE/ELIF cmd": |
9866 | * skip cmd and all following ones */ | 9871 | * skip cmd and all following ones */ |
9872 | debug_printf_exec("skipped ELSE/ELIF branch because IF condition was true\n"); | ||
9867 | break; | 9873 | break; |
9868 | } | 9874 | } |
9875 | //if (rword == RES_THEN): "if <true> THEN cmd", run cmd (fall through) | ||
9869 | } | 9876 | } |
9870 | #endif | 9877 | #endif |
9878 | IF_HAS_KEYWORDS(last_rword = rword;) | ||
9871 | #if ENABLE_HUSH_LOOPS | 9879 | #if ENABLE_HUSH_LOOPS |
9872 | if (rword == RES_FOR) { /* && pi->num_cmds - always == 1 */ | 9880 | if (rword == RES_FOR) { /* && pi->num_cmds - always == 1 */ |
9873 | if (!for_lcur) { | 9881 | if (!for_lcur) { |
@@ -9943,7 +9951,7 @@ static int run_list(struct pipe *pi) | |||
9943 | ); | 9951 | ); |
9944 | /* TODO: which FNM_xxx flags to use? */ | 9952 | /* TODO: which FNM_xxx flags to use? */ |
9945 | cond_code = (fnmatch(pattern, case_word, /*flags:*/ 0) != 0); | 9953 | cond_code = (fnmatch(pattern, case_word, /*flags:*/ 0) != 0); |
9946 | debug_printf_exec("fnmatch(pattern:'%s',str:'%s'):%d\n", | 9954 | debug_printf_exec("cond_code=fnmatch(pattern:'%s',str:'%s'):%d\n", |
9947 | pattern, case_word, cond_code); | 9955 | pattern, case_word, cond_code); |
9948 | free(pattern); | 9956 | free(pattern); |
9949 | if (cond_code == 0) { | 9957 | if (cond_code == 0) { |
@@ -10069,8 +10077,10 @@ static int run_list(struct pipe *pi) | |||
10069 | 10077 | ||
10070 | /* Analyze how result affects subsequent commands */ | 10078 | /* Analyze how result affects subsequent commands */ |
10071 | #if ENABLE_HUSH_IF | 10079 | #if ENABLE_HUSH_IF |
10072 | if (rword == RES_IF || rword == RES_ELIF) | 10080 | if (rword == RES_IF || rword == RES_ELIF) { |
10081 | debug_printf_exec("cond_code=rcode:%d\n", rcode); | ||
10073 | cond_code = rcode; | 10082 | cond_code = rcode; |
10083 | } | ||
10074 | #endif | 10084 | #endif |
10075 | check_jobs_and_continue: | 10085 | check_jobs_and_continue: |
10076 | checkjobs(NULL, 0 /*(no pid to wait for)*/); | 10086 | checkjobs(NULL, 0 /*(no pid to wait for)*/); |
@@ -10111,7 +10121,7 @@ static int run_list(struct pipe *pi) | |||
10111 | free(case_word); | 10121 | free(case_word); |
10112 | #endif | 10122 | #endif |
10113 | debug_leave(); | 10123 | debug_leave(); |
10114 | debug_printf_exec("run_list lvl %d return %d\n", G.run_list_level + 1, rcode); | 10124 | debug_printf_exec("run_list lvl %d return %d\n", G.run_list_level, rcode); |
10115 | return rcode; | 10125 | return rcode; |
10116 | } | 10126 | } |
10117 | 10127 | ||
@@ -10823,6 +10833,11 @@ static int FAST_FUNC builtin_true(char **argv UNUSED_PARAM) | |||
10823 | return 0; | 10833 | return 0; |
10824 | } | 10834 | } |
10825 | 10835 | ||
10836 | static int FAST_FUNC builtin_false(char **argv UNUSED_PARAM) | ||
10837 | { | ||
10838 | return 1; | ||
10839 | } | ||
10840 | |||
10826 | #if ENABLE_HUSH_TEST || ENABLE_HUSH_ECHO || ENABLE_HUSH_PRINTF || ENABLE_HUSH_KILL | 10841 | #if ENABLE_HUSH_TEST || ENABLE_HUSH_ECHO || ENABLE_HUSH_PRINTF || ENABLE_HUSH_KILL |
10827 | static NOINLINE int run_applet_main(char **argv, int (*applet_main_func)(int argc, char **argv)) | 10842 | static NOINLINE int run_applet_main(char **argv, int (*applet_main_func)(int argc, char **argv)) |
10828 | { | 10843 | { |
diff --git a/shell/hush_test/hush-misc/elif1.right b/shell/hush_test/hush-misc/elif1.right new file mode 100644 index 000000000..36dc59fed --- /dev/null +++ b/shell/hush_test/hush-misc/elif1.right | |||
@@ -0,0 +1,4 @@ | |||
1 | ELIF1 | ||
2 | ELIF2 | ||
3 | ELIF THEN | ||
4 | Ok:0 | ||
diff --git a/shell/hush_test/hush-misc/elif1.tests b/shell/hush_test/hush-misc/elif1.tests new file mode 100755 index 000000000..77b8a25ea --- /dev/null +++ b/shell/hush_test/hush-misc/elif1.tests | |||
@@ -0,0 +1,6 @@ | |||
1 | if false; then | ||
2 | : | ||
3 | elif echo 'ELIF1'; echo 'ELIF2'; then | ||
4 | echo "ELIF THEN" | ||
5 | fi | ||
6 | echo "Ok:$?" | ||
diff --git a/shell/hush_test/hush-misc/elif2.right b/shell/hush_test/hush-misc/elif2.right new file mode 100644 index 000000000..8f2851f91 --- /dev/null +++ b/shell/hush_test/hush-misc/elif2.right | |||
@@ -0,0 +1,2 @@ | |||
1 | THEN | ||
2 | Ok:0 | ||
diff --git a/shell/hush_test/hush-misc/elif2.tests b/shell/hush_test/hush-misc/elif2.tests new file mode 100755 index 000000000..3e5876f05 --- /dev/null +++ b/shell/hush_test/hush-misc/elif2.tests | |||
@@ -0,0 +1,8 @@ | |||
1 | if true; then | ||
2 | echo "THEN" | ||
3 | elif echo "ELIF false"; false; then | ||
4 | echo "ELIF THEN" | ||
5 | else | ||
6 | echo "ELSE" | ||
7 | fi | ||
8 | echo "Ok:$?" | ||