From 4350694b55f676af23365ce14814c57032824ae9 Mon Sep 17 00:00:00 2001 From: Kevin McCarthy Date: Mon, 17 Sep 2018 19:40:22 -0700 Subject: [PATCH] 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. --- attach.c | 12 ++++++++---- filter.c | 26 ++++++++++++++++++++++++++ protos.h | 1 + 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/attach.c b/attach.c index f09e5acc..2a2661f4 100644 --- a/attach.c +++ b/attach.c @@ -479,11 +479,15 @@ int mutt_view_attachment (FILE *fp, BODY *a, int flag, HEADER *hdr, else snprintf (descrip, sizeof (descrip), _("---Command: %-30.30s Attachment: %s"), command, type); - } - if ((mutt_wait_filter (thepid) || (entry->needsterminal && - option (OPTWAITKEY))) && !use_pager) - mutt_any_key_to_continue (NULL); + mutt_wait_filter (thepid); + } + else + { + if (mutt_wait_interactive_filter (thepid) || + (entry->needsterminal && option (OPTWAITKEY))) + mutt_any_key_to_continue (NULL); + } if (tempfd != -1) close (tempfd); 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; +} diff --git a/protos.h b/protos.h index 1b38563e..a137dd14 100644 --- a/protos.h +++ b/protos.h @@ -385,6 +385,7 @@ int mutt_thread_set_flag (HEADER *, int, int, int); int mutt_user_is_recipient (HEADER *); void mutt_update_num_postponed (void); int mutt_wait_filter (pid_t); +int mutt_wait_interactive_filter (pid_t); int mutt_which_case (const char *); int mutt_write_fcc (const char *path, HEADER *hdr, const char *msgid, int, char *); int mutt_write_mime_body (BODY *, FILE *); -- 2.40.0