diff --git a/histrap.c b/histrap.c index 320ce77..d19dbb6 100644 --- a/histrap.c +++ b/histrap.c @@ -27,7 +27,7 @@ #include #endif -__RCSID("$MirOS: src/bin/mksh/histrap.c,v 1.147 2015/07/05 19:37:15 tg Exp $"); +__RCSID("$MirOS: src/bin/mksh/histrap.c,v 1.148 2015/07/05 19:53:45 tg Exp $"); Trap sigtraps[ksh_NSIG + 1]; static struct sigaction Sigact_ign; @@ -84,6 +84,9 @@ static const char TFCEDIT_dollaru[] = "${FCEDIT:-/bin/ed} $_"; /* maximum considered size of persistent history file */ #define MKSH_MAXHISTFSIZE ((off_t)1048576 * 96) +/* hidden option */ +#define HIST_DISCARD 5 + int c_fc(const char **wp) { @@ -567,6 +570,7 @@ sethistfile(const char *name) afree(hname, APERM); hname = NULL; /* let's reset the history */ + histsave(NULL, NULL, HIST_DISCARD, true); histptr = history - 1; hist_source->line = 0; } @@ -601,6 +605,8 @@ histsync(void) { bool changed = false; + /* called by histsave(), may not HIST_DISCARD, caller should flush */ + if (histfd != -1) { int lno = hist_source->line; @@ -626,6 +632,12 @@ histsave(int *lnp, const char *cmd, int svmode, bool ignoredups) char **hp, *c; const char *ccp; + if (svmode == HIST_DISCARD) { + afree(enqueued, APERM); + enqueued = NULL; + return; + } + if (svmode == HIST_APPEND) { if (!enqueued) svmode = HIST_STORE; @@ -734,6 +746,8 @@ hist_init(Source *s) enum { hist_init_first, hist_init_retry, hist_init_restore } hs; #endif + histsave(NULL, NULL, HIST_DISCARD, true); + if (Flag(FTALKING) == 0) return; diff --git a/lex.c b/lex.c index 7839d90..fb80244 100644 --- a/lex.c +++ b/lex.c @@ -23,7 +23,7 @@ #include "sh.h" -__RCSID("$MirOS: src/bin/mksh/lex.c,v 1.203 2015/07/05 19:37:16 tg Exp $"); +__RCSID("$MirOS: src/bin/mksh/lex.c,v 1.204 2015/07/05 19:53:46 tg Exp $"); /* * states while lexing word @@ -1474,8 +1474,10 @@ getsc_line(Source *s) cp = Xstring(s->xs, xp); while (*cp && ctype(*cp, C_IFSWS)) ++cp; - if (!*cp) + if (!*cp) { + histsave(&s->line, NULL, HIST_FLUSH, true); histsync(); + } #endif } if (interactive)