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.
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);
#include "mutt.h"
#include "mutt_curses.h"
+#ifdef USE_IMAP
+# include "imap.h"
+#endif
#include <unistd.h>
#include <stdlib.h>
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;
+}
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 *);