Hi, Problem: Zsh truncates the zsh history file if you are running out of disk space (AKA ENOSPC). If you don't have any space left in your $HOME and exit zsh you'll find an empty $HISTFILE left. Reason: The savehistfile() function in Src/hist.c does not handle write errors very smart. Fix: See attached patch (against version 4.3.4). The fix might need some more work though. For example there should be much more and better error handling; Zsh shouldn't exit with a return value of 0 when such serious errors happen; the user should be informed about the reason why it failed. regards, -mika- -- ,'"`. http://www.michael-prokop.at/ ( grml.org -» Linux Live-CD for texttool-users and sysadmins `._,' http://www.grml.org/
--- Src/hist.c.orig	2007-06-11 21:02:42.000000000 +0200
+++ Src/hist.c	2007-06-11 21:58:37.000000000 +0200
@@ -2158,6 +2158,11 @@
     Histent he;
     zlong xcurhist = curhist - !!(histactive & HA_ACTIVE);
     int extended_history = isset(EXTENDEDHISTORY);
+    int write_file = 1; // by default assume we can write the file
+
+    // make sure we don't write anything in case of an error
+    if (errno == ENOSPC)
+      write_file = 0;
 
     if (!interact || savehistsiz <= 0 || !hist_ring
      || (!fn && !(fn = getsparam("HISTFILE"))))
@@ -2222,7 +2227,7 @@
 #endif
 	}
     }
-    if (out) {
+    if (out && write_file) {
 	for (; he && he->histnum <= xcurhist; he = down_histent(he)) {
 	    if ((writeflags & HFILE_SKIPDUPS && he->node.flags & HIST_DUP)
 	     || (writeflags & HFILE_SKIPFOREIGN && he->node.flags & HIST_FOREIGN)
Attachment:
signature.asc
Description: Digital signature