diff options
author | Denys Vlasenko | 2011-09-04 15:28:03 +0200 |
---|---|---|
committer | Denys Vlasenko | 2011-09-04 15:28:03 +0200 |
commit | 4840ae8a06298e987374fa3cc6d7e4969fd19344 (patch) | |
tree | 53fd9b0ffe5eb4a8798aa3fd6a3c1299c7357dc0 | |
parent | 7b46220d922d7c6267a8442ff8c3a6d1ab106727 (diff) | |
download | busybox-4840ae8a06298e987374fa3cc6d7e4969fd19344.zip busybox-4840ae8a06298e987374fa3cc6d7e4969fd19344.tar.gz |
lineedit: fix atomic replace of history file; hush: fix $HISTFILE handling
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | libbb/lineedit.c | 4 | ||||
-rw-r--r-- | shell/ash.c | 2 | ||||
-rw-r--r-- | shell/hush.c | 40 |
3 files changed, 26 insertions, 20 deletions
diff --git a/libbb/lineedit.c b/libbb/lineedit.c index 1026519..5d13904 100644 --- a/libbb/lineedit.c +++ b/libbb/lineedit.c @@ -1425,7 +1425,7 @@ static void save_history(char *str) /* write out temp file and replace hist_file atomically */ new_name = xasprintf("%s.%u.new", state->hist_file, (int) getpid()); - fd = open(state->hist_file, O_WRONLY | O_CREAT | O_TRUNC, 0600); + fd = open(new_name, O_WRONLY | O_CREAT | O_TRUNC, 0600); if (fd >= 0) { FILE *fp; int i; @@ -1475,7 +1475,7 @@ static void remember_in_history(char *str) /* i <= state->max_history */ state->cur_history = i; state->cnt_history = i; -# if MAX_HISTORY > 0 && ENABLE_FEATURE_EDITING_SAVEHISTORY +# if ENABLE_FEATURE_EDITING_SAVEHISTORY if ((state->flags & SAVE_HISTORY) && state->hist_file) save_history(str); # endif diff --git a/shell/ash.c b/shell/ash.c index d48cd01..bf376bd 100644 --- a/shell/ash.c +++ b/shell/ash.c @@ -13194,7 +13194,7 @@ int ash_main(int argc UNUSED_PARAM, char **argv) } if (sflag || minusc == NULL) { -#if defined MAX_HISTORY && MAX_HISTORY > 0 && ENABLE_FEATURE_EDITING_SAVEHISTORY +#if MAX_HISTORY > 0 && ENABLE_FEATURE_EDITING_SAVEHISTORY if (iflag) { const char *hp = lookupvar("HISTFILE"); if (hp) diff --git a/shell/hush.c b/shell/hush.c index e4138ad..42143fd 100644 --- a/shell/hush.c +++ b/shell/hush.c @@ -7816,23 +7816,7 @@ int hush_main(int argc, char **argv) */ #if ENABLE_FEATURE_EDITING - G.line_input_state = new_line_input_t(FOR_SHELL); -# if defined MAX_HISTORY && MAX_HISTORY > 0 && ENABLE_HUSH_SAVEHISTORY - { - const char *hp = get_local_var_value("HISTFILE"); - if (!hp) { - hp = get_local_var_value("HOME"); - if (hp) { - G.line_input_state->hist_file = concat_path_file(hp, ".hush_history"); - //set_local_var(xasprintf("HISTFILE=%s", ...)); - } - } -# if ENABLE_FEATURE_SH_HISTFILESIZE - hp = get_local_var_value("HISTFILESIZE"); - G.line_input_state->max_history = size_from_HISTFILESIZE(hp); -# endif - } -# endif + G.line_input_state = new_line_input_t(FOR_SHELL & ~SAVE_HISTORY); #endif /* Initialize some more globals to non-zero values */ @@ -8104,6 +8088,28 @@ int hush_main(int argc, char **argv) /* -1 is special - makes xfuncs longjmp, not exit * (we reset die_sleep = 0 whereever we [v]fork) */ enable_restore_tty_pgrp_on_exit(); /* sets die_sleep = -1 */ + +# if ENABLE_HUSH_SAVEHISTORY && MAX_HISTORY > 0 + { + const char *hp = get_local_var_value("HISTFILE"); + if (!hp) { + hp = get_local_var_value("HOME"); + if (hp) + hp = concat_path_file(hp, ".hush_history"); + } else { + hp = xstrdup(hp); + } + if (hp) { + G.line_input_state->hist_file = hp; + G.line_input_state->flags |= SAVE_HISTORY; + //set_local_var(xasprintf("HISTFILE=%s", ...)); + } +# if ENABLE_FEATURE_SH_HISTFILESIZE + hp = get_local_var_value("HISTFILESIZE"); + G.line_input_state->max_history = size_from_HISTFILESIZE(hp); +# endif + } +# endif } else { install_special_sighandlers(); } |