summary refs log tree commit diff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--bin/1sh/1sh.15
-rw-r--r--bin/1sh/histedit.c38
-rw-r--r--bin/1sh/main.c4
-rw-r--r--bin/1sh/myhistedit.h1
-rw-r--r--bin/1sh/var.c3
-rw-r--r--bin/1sh/var.h2
6 files changed, 51 insertions, 2 deletions
diff --git a/bin/1sh/1sh.1 b/bin/1sh/1sh.1
index d72a87c7..aa906bca 100644
--- a/bin/1sh/1sh.1
+++ b/bin/1sh/1sh.1
@@ -1351,6 +1351,11 @@ If not set, the default editor is
 The default editor used with the
 .Ic fc
 built-in.
+.It Va HISTFILE
+The path to the file in which command history is saved.
+History is loaded when
+.Va HISTFILE
+is set and saved on exit.
 .It Va HISTSIZE
 The number of previous commands that are accessible.
 .It Va HOME
diff --git a/bin/1sh/histedit.c b/bin/1sh/histedit.c
index 520b4554..9784b1f1 100644
--- a/bin/1sh/histedit.c
+++ b/bin/1sh/histedit.c
@@ -69,6 +69,9 @@ EditLine *el;	/* editline cookie */
 int displayhist;
 static FILE *el_in, *el_out, *el_err;
 
+static void history_load(const char *hf);
+static void history_save(const char *hf);
+
 static char *fc_replace(const char *, char *, char *);
 static int not_fcnumber(const char *);
 static int str_to_event(const char *, int);
@@ -92,9 +95,10 @@ histedit(void)
 			hist = history_init();
 			INTON;
 
-			if (hist != NULL)
+			if (hist != NULL) {
 				sethistsize(histsizeval());
-			else
+				sethistfile(histfileval());
+			} else
 				out2fmt_flush("sh: can't initialize history\n");
 		}
 		if (editing && !el && isatty(0)) { /* && isatty(2) ??? */
@@ -152,6 +156,8 @@ bad:
 			el = NULL;
 		}
 		if (hist) {
+			if (*histfileval() != '\0')
+				history_save(histfileval());
 			history_end(hist);
 			hist = NULL;
 		}
@@ -161,6 +167,34 @@ bad:
 
 
 void
+sethistfile(const char *hf)
+{
+	if (hist != NULL && hf != NULL && *hf != '\0')
+		history_load(hf);
+}
+
+
+static void
+history_load(const char *hf)
+{
+	HistEvent he;
+
+	if (history(hist, &he, H_LOAD, hf) == -1)
+		warning("%s: %s", he.str, hf);
+}
+
+
+static void
+history_save(const char *hf)
+{
+	HistEvent he;
+
+	if (history(hist, &he, H_SAVE, hf) == -1)
+		warning("%s: %s", he.str, hf);
+}
+
+
+void
 sethistsize(const char *hs)
 {
 	int histsize;
diff --git a/bin/1sh/main.c b/bin/1sh/main.c
index 14b7af01..86b6e981 100644
--- a/bin/1sh/main.c
+++ b/bin/1sh/main.c
@@ -179,6 +179,8 @@ state4:
 	if (sflag || minusc == NULL) {
 		cmdloop(1);
 	}
+	iflag = 0;
+	optschanged();
 	exitshell(exitstatus);
 	/*NOTREACHED*/
 	return 0;
@@ -345,6 +347,8 @@ exitcmd(int argc, char **argv)
 {
 	if (stoppedjobs())
 		return 0;
+	iflag = 0;
+	optschanged();
 	if (argc > 1)
 		exitshell(number(argv[1]));
 	else
diff --git a/bin/1sh/myhistedit.h b/bin/1sh/myhistedit.h
index 3f1b4d64..e9a2be2c 100644
--- a/bin/1sh/myhistedit.h
+++ b/bin/1sh/myhistedit.h
@@ -39,6 +39,7 @@ extern EditLine *el;
 extern int displayhist;
 
 void histedit(void);
+void sethistfile(const char *);
 void sethistsize(const char *);
 void setterm(const char *);
 
diff --git a/bin/1sh/var.c b/bin/1sh/var.c
index b501ef4a..d7467cc7 100644
--- a/bin/1sh/var.c
+++ b/bin/1sh/var.c
@@ -85,6 +85,7 @@ struct varinit {
 
 
 #ifndef NO_HISTORY
+struct var vhistfile;
 struct var vhistsize;
 struct var vterm;
 #endif
@@ -106,6 +107,8 @@ int forcelocal;
 
 static const struct varinit varinit[] = {
 #ifndef NO_HISTORY
+	{ &vhistfile,	VUNSET,				"HISTFILE=",
+	  sethistfile },
 	{ &vhistsize,	VUNSET,				"HISTSIZE=",
 	  sethistsize },
 #endif
diff --git a/bin/1sh/var.h b/bin/1sh/var.h
index 1bdf4afd..d06d8688 100644
--- a/bin/1sh/var.h
+++ b/bin/1sh/var.h
@@ -85,6 +85,7 @@ extern struct var vrps1;
 extern struct var vrps2;
 extern struct var vdisvfork;
 #ifndef NO_HISTORY
+extern struct var vhistfile;
 extern struct var vhistsize;
 extern struct var vterm;
 #endif
@@ -112,6 +113,7 @@ extern int initial_localeisutf8;
 #define rps2val()	(vrps2.text + 5)
 #define optindval()	(voptind.text + 7)
 #ifndef NO_HISTORY
+#define histfileval()	(vhistfile.text + 9)
 #define histsizeval()	(vhistsize.text + 9)
 #define termval()	(vterm.text + 5)
 #endif