From 5452f0ed02bfbca5bb7cc68336a87844246c55da Mon Sep 17 00:00:00 2001
From: JohnD <john.donoghue@ieee.org>
Date: Thu, 4 Apr 2019 10:58:13 -0400
Subject: [PATCH] Add private history_rename function and in WIN32, use windows
 function instead of rename

---
 histfile.c | 26 ++++++++++++++++++++++----
 1 file changed, 22 insertions(+), 4 deletions(-)

diff --git a/histfile.c b/histfile.c
index dc64bde..cf23f53 100644
--- a/histfile.c
+++ b/histfile.c
@@ -107,6 +107,11 @@ extern int errno;
 #  define PATH_MAX	1024	/* default */
 #endif
 
+#if defined(_WIN32)
+ #define WIN32_LEAN_AND_MEAN
+ #include <windows.h>
+#endif
+
 extern void _hs_append_history_line PARAMS((int, const char *));
 
 /* history file version; currently unused */
@@ -139,6 +144,19 @@ static char *history_tempfile PARAMS((const char *));
 static int histfile_backup PARAMS((const char *, const char *));
 static int histfile_restore PARAMS((const char *, const char *));
 
+static int
+history_rename(const char *from, const char *to)
+{
+#if defined(_WIN32)
+  if (!MoveFileEx(from, to, MOVEFILE_REPLACE_EXISTING)) {
+    return -1;
+  }
+  return 0;
+#else
+  return rename(from, to);
+#endif
+}
+
 /* Return the string that should be used in the place of this
    filename.  This only matters when you don't specify the
    filename to read_history (), or write_history (). */
@@ -448,10 +466,10 @@ histfile_backup (const char *filename, const char *back)
   if ((n = readlink (filename, linkbuf, sizeof (linkbuf) - 1)) > 0)
     {
       linkbuf[n] = '\0';
-      return (rename (linkbuf, back));
+      return (history_rename (linkbuf, back));
     }
 #endif
-  return (rename (filename, back));
+  return (history_rename (filename, back));
 }
 
 /* Restore ORIG from BACKUP handling case where ORIG is a symlink
@@ -467,10 +485,10 @@ histfile_restore (const char *backup, const char *orig)
   if ((n = readlink (orig, linkbuf, sizeof (linkbuf) - 1)) > 0)
     {
       linkbuf[n] = '\0';
-      return (rename (backup, linkbuf));
+      return (history_rename (backup, linkbuf));
     }
 #endif
-  return (rename (backup, orig));
+  return (history_rename (backup, orig));
 }
 
 /* Truncate the history file FNAME, leaving only LINES trailing lines.
-- 
2.17.1

