Package: rlfe
Version: 6.0-3
Severity: normal
Tags: patch
I found rlfe sometimes doesn't save its command history as expected. I
tracked this down to the two different ways rlfe can exit. (Search for
"exit (0)" in the source.) The first is SIGCHLD from its inferior, the
second is read error from its inferior. History was not being saved in
the second case. The attached patch fixes this.
It seems that normally the first path is run. I don't know exactly why
I caused the second path, but perhaps it happens when the inferior
closes its output then takes a while longer to exit. If you don't think
the change is legitimate, I'll do some more digging to figure out what
triggers this case.
Andrew
-- System Information:
Debian Release: squeeze/sid
APT prefers unstable
APT policy: (500, 'unstable')
Architecture: i386 (i686)
Kernel: Linux 2.6.30-1-686 (SMP w/1 CPU core)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/bash
Versions of packages rlfe depends on:
ii libc6 2.9-25 GNU C Library: Shared libraries
ii libncurses5 5.7+20090803-2 shared libraries for terminal hand
ii libreadline6 6.0-4 GNU readline and history libraries
rlfe recommends no packages.
rlfe suggests no packages.
-- no debconf information
--- rlfe.c.orig 2009-09-03 13:42:35.000000000 -0700
+++ rlfe.c 2009-09-03 13:41:06.000000000 -0700
@@ -154,21 +154,27 @@
static pid_t child = -1;
static void
-sig_child (int signo)
+finish_up()
{
- int status;
- wait (&status);
if (hist_file != 0)
{
write_history (hist_file);
if (hist_size)
history_truncate_file (hist_file, hist_size);
}
- DPRINT0 ("(Child process died.)\n");
tcsetattr(STDIN_FILENO, TCSANOW, &orig_term);
exit (0);
}
+static void
+sig_child (int signo)
+{
+ int status;
+ wait (&status);
+ DPRINT0 ("(Child process died.)\n");
+ finish_up();
+}
+
volatile int propagate_sigwinch = 0;
/* sigwinch_handler
@@ -703,8 +709,7 @@
if (count <= 0)
{
DPRINT0 ("(Connection closed by foreign host.)\n");
- tcsetattr(STDIN_FILENO, TCSANOW, &orig_term);
- exit (0);
+ finish_up();
}
old_count = buf_count;