diff options
Diffstat (limited to 'shell/hush.c')
-rw-r--r-- | shell/hush.c | 48 |
1 files changed, 41 insertions, 7 deletions
diff --git a/shell/hush.c b/shell/hush.c index 4a97293cc..0b2bc01f5 100644 --- a/shell/hush.c +++ b/shell/hush.c | |||
@@ -1973,7 +1973,7 @@ static void record_pending_signo(int sig) | |||
1973 | || (G_traps && G_traps[SIGCHLD] && G_traps[SIGCHLD][0]) | 1973 | || (G_traps && G_traps[SIGCHLD] && G_traps[SIGCHLD][0]) |
1974 | /* ^^^ if SIGCHLD, interrupt line reading only if it has a trap */ | 1974 | /* ^^^ if SIGCHLD, interrupt line reading only if it has a trap */ |
1975 | ) { | 1975 | ) { |
1976 | bb_got_signal = sig; /* for read_line_input: "we got a signal" */ | 1976 | bb_got_signal = sig; /* for read_line_input / read builtin: "we got a signal" */ |
1977 | } | 1977 | } |
1978 | #endif | 1978 | #endif |
1979 | #if ENABLE_HUSH_FAST | 1979 | #if ENABLE_HUSH_FAST |
@@ -2099,11 +2099,29 @@ static sighandler_t pick_sighandler(unsigned sig) | |||
2099 | return handler; | 2099 | return handler; |
2100 | } | 2100 | } |
2101 | 2101 | ||
2102 | static const char* FAST_FUNC get_local_var_value(const char *name); | ||
2103 | |||
2102 | /* Restores tty foreground process group, and exits. */ | 2104 | /* Restores tty foreground process group, and exits. */ |
2103 | static void hush_exit(int exitcode) | 2105 | static void hush_exit(int exitcode) |
2104 | { | 2106 | { |
2105 | #if ENABLE_FEATURE_EDITING_SAVE_ON_EXIT | 2107 | #if ENABLE_FEATURE_EDITING_SAVE_ON_EXIT |
2106 | save_history(G.line_input_state); /* may be NULL */ | 2108 | if (G.line_input_state) { |
2109 | const char *hp; | ||
2110 | # if ENABLE_FEATURE_SH_HISTFILESIZE | ||
2111 | // in bash: | ||
2112 | // HISTFILESIZE controls the on-disk history file size (in lines, 0=no history): | ||
2113 | // "When this variable is assigned a value, the history file is truncated, if necessary" | ||
2114 | // but we do it only at exit, not on every assignment: | ||
2115 | /* Use HISTFILESIZE to limit file size */ | ||
2116 | hp = get_local_var_value("HISTFILESIZE"); | ||
2117 | if (hp) | ||
2118 | G.line_input_state->max_history = size_from_HISTFILESIZE(hp); | ||
2119 | # endif | ||
2120 | /* HISTFILE: "If unset, the command history is not saved when a shell exits." */ | ||
2121 | hp = get_local_var_value("HISTFILE"); | ||
2122 | G.line_input_state->hist_file = hp; | ||
2123 | save_history(G.line_input_state); /* no-op if hist_file is NULL or "" */ | ||
2124 | } | ||
2107 | #endif | 2125 | #endif |
2108 | 2126 | ||
2109 | fflush_all(); | 2127 | fflush_all(); |
@@ -10427,7 +10445,7 @@ int hush_main(int argc, char **argv) | |||
10427 | if (!get_local_var_value("PATH")) | 10445 | if (!get_local_var_value("PATH")) |
10428 | set_local_var_from_halves("PATH", bb_default_root_path); | 10446 | set_local_var_from_halves("PATH", bb_default_root_path); |
10429 | 10447 | ||
10430 | /* PS1/PS2 are set later, if we determine that we are interactive */ | 10448 | /* PS1/PS2/HISTFILE are set later, if we determine that we are interactive */ |
10431 | 10449 | ||
10432 | /* bash also exports SHLVL and _, | 10450 | /* bash also exports SHLVL and _, |
10433 | * and sets (but doesn't export) the following variables: | 10451 | * and sets (but doesn't export) the following variables: |
@@ -10449,7 +10467,6 @@ int hush_main(int argc, char **argv) | |||
10449 | * BASH_SOURCE=() | 10467 | * BASH_SOURCE=() |
10450 | * DIRSTACK=() | 10468 | * DIRSTACK=() |
10451 | * PIPESTATUS=([0]="0") | 10469 | * PIPESTATUS=([0]="0") |
10452 | * HISTFILE=/<xxx>/.bash_history | ||
10453 | * HISTFILESIZE=500 | 10470 | * HISTFILESIZE=500 |
10454 | * HISTSIZE=500 | 10471 | * HISTSIZE=500 |
10455 | * MAILCHECK=60 | 10472 | * MAILCHECK=60 |
@@ -10809,18 +10826,30 @@ int hush_main(int argc, char **argv) | |||
10809 | const char *hp = get_local_var_value("HISTFILE"); | 10826 | const char *hp = get_local_var_value("HISTFILE"); |
10810 | if (!hp) { | 10827 | if (!hp) { |
10811 | hp = get_local_var_value("HOME"); | 10828 | hp = get_local_var_value("HOME"); |
10812 | if (hp) | 10829 | if (hp) { |
10813 | hp = concat_path_file(hp, ".hush_history"); | 10830 | hp = concat_path_file(hp, ".hush_history"); |
10831 | /* Make HISTFILE set on exit (else history won't be saved) */ | ||
10832 | set_local_var_from_halves("HISTFILE", hp); | ||
10833 | } | ||
10814 | } else { | 10834 | } else { |
10815 | hp = xstrdup(hp); | 10835 | hp = xstrdup(hp); |
10816 | } | 10836 | } |
10817 | if (hp) { | 10837 | if (hp) { |
10818 | G.line_input_state->hist_file = hp; | 10838 | G.line_input_state->hist_file = hp; |
10819 | //set_local_var(xasprintf("HISTFILE=%s", ...)); | ||
10820 | } | 10839 | } |
10821 | # if ENABLE_FEATURE_SH_HISTFILESIZE | 10840 | # if ENABLE_FEATURE_SH_HISTFILESIZE |
10822 | hp = get_local_var_value("HISTFILESIZE"); | 10841 | hp = get_local_var_value("HISTSIZE"); |
10842 | /* Using HISTFILESIZE above to limit max_history would be WRONG: | ||
10843 | * users may set HISTFILESIZE=0 in their profile scripts | ||
10844 | * to prevent _saving_ of history files, but still want to have | ||
10845 | * non-zero history limit for in-memory list. | ||
10846 | */ | ||
10847 | // in bash, runtime history size is controlled by HISTSIZE (0=no history), | ||
10848 | // HISTFILESIZE controls on-disk history file size (in lines, 0=no history): | ||
10823 | G.line_input_state->max_history = size_from_HISTFILESIZE(hp); | 10849 | G.line_input_state->max_history = size_from_HISTFILESIZE(hp); |
10850 | // HISTFILESIZE: "The shell sets the default value to the value of HISTSIZE after reading any startup files." | ||
10851 | // HISTSIZE: "The shell sets the default value to 500 after reading any startup files." | ||
10852 | // (meaning: if the value wasn't set after startup files, the default value is set as described above) | ||
10824 | # endif | 10853 | # endif |
10825 | } | 10854 | } |
10826 | # endif | 10855 | # endif |
@@ -11175,6 +11204,11 @@ static int FAST_FUNC builtin_read(char **argv) | |||
11175 | goto again; | 11204 | goto again; |
11176 | } | 11205 | } |
11177 | 11206 | ||
11207 | if ((uintptr_t)r == 2) /* -t SEC timeout? */ | ||
11208 | /* bash: "The exit status is greater than 128 if the timeout is exceeded." */ | ||
11209 | /* The actual value observed with bash 5.2.15: */ | ||
11210 | return 128 + SIGALRM; | ||
11211 | |||
11178 | if ((uintptr_t)r > 1) { | 11212 | if ((uintptr_t)r > 1) { |
11179 | bb_simple_error_msg(r); | 11213 | bb_simple_error_msg(r); |
11180 | r = (char*)(uintptr_t)1; | 11214 | r = (char*)(uintptr_t)1; |