Page MenuHomeFreeBSD

D29493.id88524.diff
No OneTemporary

D29493.id88524.diff

Index: bin/sh/histedit.c
===================================================================
--- bin/sh/histedit.c
+++ bin/sh/histedit.c
@@ -41,6 +41,7 @@
#include <sys/param.h>
#include <sys/stat.h>
#include <dirent.h>
+#include <fcntl.h>
#include <limits.h>
#include <paths.h>
#include <stdio.h>
@@ -78,6 +79,64 @@
static char **sh_matches(const char *, int, int);
static unsigned char sh_complete(EditLine *, int);
+static const char *
+get_histfile(void)
+{
+ const char *histfile;
+
+ /* don't try to save if the history size is 0 */
+ if (hist == NULL || histsizeval() == 0)
+ return (NULL);
+ histfile = expandstr("${HISTFILE-${HOME-}/.sh_history}");
+
+ if (strlen(histfile) == 0)
+ return (NULL);
+ return (histfile);
+}
+
+void
+histsave(void)
+{
+ HistEvent he;
+ char *histtmpname = NULL;
+ const char *histfile;
+ int fd;
+ FILE *f;
+
+ if ((histfile = get_histfile()) == NULL)
+ return;
+ INTOFF;
+ asprintf(&histtmpname, "%s.XXXXXXXXXX", histfile);
+ if (histtmpname == NULL) {
+ INTON;
+ return;
+ }
+ fd = mkstemp(histtmpname);
+ if (fd < 0 || (f = fdopen(fd, "w")) == NULL) {
+ free(histtmpname);
+ INTON;
+ return;
+ }
+ if (history(hist, &he, H_SAVE_FP, f) < 1 ||
+ rename(histtmpname, histfile) == -1)
+ unlink(histtmpname);
+ fclose(f);
+ free(histtmpname);
+ INTON;
+
+}
+
+void
+histload(void)
+{
+ const char *histfile;
+ HistEvent he;
+
+ if ((histfile = get_histfile()) == NULL)
+ return;
+ history(hist, &he, H_LOAD, histfile);
+}
+
/*
* Set history and editing status. Called whenever the status may
* have changed (figures out what to do).
Index: bin/sh/main.c
===================================================================
--- bin/sh/main.c
+++ bin/sh/main.c
@@ -75,6 +75,9 @@
#include "cd.h"
#include "redir.h"
#include "builtins.h"
+#ifndef NO_HISTORY
+#include "myhistedit.h"
+#endif
int rootpid;
int rootshell;
@@ -157,6 +160,10 @@
read_profile(shinit);
}
}
+#ifndef NO_HISTORY
+ if (iflag)
+ histload();
+#endif
state3:
state = 4;
popstackmark(&smark2);
Index: bin/sh/myhistedit.h
===================================================================
--- bin/sh/myhistedit.h
+++ bin/sh/myhistedit.h
@@ -43,4 +43,5 @@
void histedit(void);
void sethistsize(const char *);
void setterm(const char *);
-
+void histload(void);
+void histsave(void);
Index: bin/sh/sh.1
===================================================================
--- bin/sh/sh.1
+++ bin/sh/sh.1
@@ -32,7 +32,7 @@
.\" from: @(#)sh.1 8.6 (Berkeley) 5/4/95
.\" $FreeBSD$
.\"
-.Dd July 6, 2020
+.Dd May 4, 2021
.Dt SH 1
.Os
.Sh NAME
@@ -1351,6 +1351,15 @@
The default editor used with the
.Ic fc
built-in.
+.It Va HISTFILE
+File used for persistent history storage.
+If unset
+.Pa ~/.sh_history
+will be used.
+If set but empty or
+.Va HISTSIZE
+is set to 0
+no loading/saving mechanism will be performed.
.It Va HISTSIZE
The number of previous commands that are accessible.
.It Va HOME
Index: bin/sh/trap.c
===================================================================
--- bin/sh/trap.c
+++ bin/sh/trap.c
@@ -535,6 +535,9 @@
flushall();
#if JOBS
setjobctl(0);
+#endif
+#ifndef NO_HISTORY
+ histsave();
#endif
}
if (sig != 0 && sig != SIGSTOP && sig != SIGTSTP && sig != SIGTTIN &&

File Metadata

Mime Type
text/plain
Expires
Sat, Jan 24, 5:29 AM (10 h, 53 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
27894179
Default Alt Text
D29493.id88524.diff (3 KB)

Event Timeline