aboutsummaryrefslogtreecommitdiff
path: root/shell/hush.c
diff options
context:
space:
mode:
Diffstat (limited to 'shell/hush.c')
-rw-r--r--shell/hush.c48
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
2102static 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. */
2103static void hush_exit(int exitcode) 2105static 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;