From 4350694b55f676af23365ce14814c57032824ae9 Mon Sep 17 00:00:00 2001 From: Kevin McCarthy Date: Mon, 17 Sep 2018 19:40:22 -0700 Subject: Send imap keepalives for interactive filters. When viewing attachments externally with a (non-copiousoutput) mailcap entry missing %s, the command is invoked as a filter, with the attachment piped into stdin. However, unlike a filter, the user interacts with the command, instead of just displaying the output in the pager. Just as with the mutt_system() command, Mutt needs to send imap keepalives to keep those connections from closing during the potentially extended invocation. Thanks to John Hawkinson for the bug report, and his suggested patch, which this commit is based upon. --- filter.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 'filter.c') diff --git a/filter.c b/filter.c index 331d5425..59d1e09c 100644 --- a/filter.c +++ b/filter.c @@ -22,6 +22,9 @@ #include "mutt.h" #include "mutt_curses.h" +#ifdef USE_IMAP +# include "imap.h" +#endif #include #include @@ -189,3 +192,26 @@ int mutt_wait_filter (pid_t pid) return rc; } + +/* + * This is used for filters that are actually interactive commands + * with input piped in: e.g. in mutt_view_attachment(), a mailcap + * entry without copiousoutput _and_ without a %s. + * + * For those cases, we treat it like a blocking system command, and + * poll IMAP to keep connections open. + */ +int mutt_wait_interactive_filter (pid_t pid) +{ + int rc; + +#ifndef USE_IMAP + waitpid (pid, &rc, 0); +#else + rc = imap_wait_keepalive (pid); +#endif + mutt_unblock_signals_system (1); + rc = WIFEXITED (rc) ? WEXITSTATUS (rc) : -1; + + return rc; +} -- cgit v1.2.3