aboutsummaryrefslogtreecommitdiff
path: root/shell/hush.c
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2025-07-03 19:10:42 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2025-07-03 19:10:42 +0200
commit9c46a0688576dd8c67d2fc24b68c07402da14fc8 (patch)
tree1dacd2f246a2010dd84f691c55b0d38bbcded093 /shell/hush.c
parent36ac283682bb176987c0c09e5f8c7e7e96fb1651 (diff)
downloadbusybox-w32-9c46a0688576dd8c67d2fc24b68c07402da14fc8.tar.gz
busybox-w32-9c46a0688576dd8c67d2fc24b68c07402da14fc8.tar.bz2
busybox-w32-9c46a0688576dd8c67d2fc24b68c07402da14fc8.zip
shell: update HISTFILESIZE code to be actually useful
"HISTFILESIZE=0" in profile wasn't working as intended, "unset HISTFILE" wasn't preventing creation of history files Now: HISTSIZE=n allows to reduce in-memory history buffer HISTFILESIZE=n allows to reduce history file size (0: truncate it) unset HISTFILE allows to not save history file at all function old new delta exitshell 138 194 +56 hush_exit 97 143 +46 save_history 266 296 +30 hush_main 1170 1186 +16 .rodata 105762 105771 +9 load_history 246 254 +8 size_from_HISTFILESIZE 44 41 -3 read_line_input 2746 2712 -34 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 6/2 up/down: 165/-37) Total: 128 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to '')
-rw-r--r--shell/hush.c41
1 files changed, 35 insertions, 6 deletions
diff --git a/shell/hush.c b/shell/hush.c
index 70b730f67..68aca53a3 100644
--- a/shell/hush.c
+++ b/shell/hush.c
@@ -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 */
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