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.
#include "mutt.h"
#include "filter.h"
#include "mutt_window.h"
+#ifdef USE_IMAP
+#include "imap/imap.h"
+#endif
/**
* mutt_create_filter_fd - Run a command on a pipe (optionally connect stdin/stdout)
return rc;
}
+
+/**
+ * mutt_wait_interactive_filter - Wait after an interactive filter
+ * @param pid Process id of the process to wait for
+ * @retval num Exit status of the process identified by pid
+ * @retval -1 Error
+ *
+ * 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;
+
+#ifdef USE_IMAP
+ rc = imap_wait_keepalive(pid);
+#else
+ waitpid(pid, &rc, 0);
+#endif
+ mutt_sig_unblock_system(true);
+ rc = WIFEXITED(rc) ? WEXITSTATUS(rc) : -1;
+
+ return rc;
+}
int fdin, int fdout, int fderr);
pid_t mutt_create_filter(const char *s, FILE **in, FILE **out, FILE **err);
int mutt_wait_filter(pid_t pid);
+int mutt_wait_interactive_filter (pid_t pid);
#endif /* MUTT_FILTER_H */