From 5e1f4ce2c3a2c0fd6a953c4f7ca2839370f9c3ae Mon Sep 17 00:00:00 2001
From: Mark Nudelman <markn@greenwoodsoftware.com>
Date: Fri, 3 Dec 2021 09:38:22 -0800
Subject: [PATCH] Add $XDG_STATE_HOME and $HOME/.local/state to list of
directories to search for the history file.
---
cmdbuf.c | 48 ++++++++++++++++++++++++++++++++----------------
less.nro.VER | 6 +++---
2 files changed, 35 insertions(+), 19 deletions(-)
diff --git a/cmdbuf.c b/cmdbuf.c
index cd99010d..abbda9b9 100644
--- a/cmdbuf.c
+++ b/cmdbuf.c
@@ -1401,14 +1401,41 @@ mlist_size(ml)
/*
* Get the name of the history file.
*/
+ static char *
+histfile_find(must_exist)
+ int must_exist;
+{
+ char *home = lgetenv("HOME");
+ char *name = NULL;
+
+ /* Try in $XDG_DATA_STATE, then in $HOME/.local/state, then in $XDG_DATA_HOME, then in $HOME. */
+#if OS2
+ if (isnullenv(home))
+ home = lgetenv("INIT");
+#endif
+ name = dirfile(lgetenv("XDG_STATE_HOME"), &LESSHISTFILE[1], must_exist);
+ if (name == NULL)
+ {
+ char *dir = dirfile(home, ".local/state", 1);
+ if (dir != NULL)
+ {
+ name = dirfile(dir, &LESSHISTFILE[1], must_exist);
+ free(dir);
+ }
+ }
+ if (name == NULL)
+ name = dirfile(lgetenv("XDG_DATA_HOME"), &LESSHISTFILE[1], must_exist);
+ if (name == NULL)
+ name = dirfile(home, LESSHISTFILE, must_exist);
+ return (name);
+}
+
static char *
histfile_name(must_exist)
int must_exist;
{
- char *home;
- char *xdg;
char *name;
-
+
/* See if filename is explicitly specified by $LESSHISTFILE. */
name = lgetenv("LESSHISTFILE");
if (!isnullenv(name))
@@ -1423,25 +1450,14 @@ histfile_name(must_exist)
if (strcmp(LESSHISTFILE, "") == 0 || strcmp(LESSHISTFILE, "-") == 0)
return (NULL);
- /* Try in $XDG_DATA_HOME first, then in $HOME. */
- xdg = lgetenv("XDG_DATA_HOME");
- home = lgetenv("HOME");
-#if OS2
- if (isnullenv(home))
- home = lgetenv("INIT");
-#endif
name = NULL;
if (!must_exist)
{
/* If we're writing the file and the file already exists, use it. */
- name = dirfile(xdg, &LESSHISTFILE[1], 1);
- if (name == NULL)
- name = dirfile(home, LESSHISTFILE, 1);
+ name = histfile_find(1);
}
if (name == NULL)
- name = dirfile(xdg, &LESSHISTFILE[1], must_exist);
- if (name == NULL)
- name = dirfile(home, LESSHISTFILE, must_exist);
+ name = histfile_find(must_exist);
return (name);
}