]> git.eshelyaron.com Git - emacs.git/commitdiff
mailcap.el: Avoid xdg-open silent failure
authorMax Nikulin <manikulin@gmail.com>
Fri, 30 Jul 2021 12:00:41 +0000 (14:00 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Fri, 30 Jul 2021 12:00:41 +0000 (14:00 +0200)
* lisp/net/mailcap.el (mailcap-view-file): Use 'pipe :connection-type
instead of 'pty to prevent killing of background process on handler
exit.  Avoid regression similar to Bug#44824.

Problem happens only in some desktop environments where mailcap handler
launches actual viewer (as defined in .desktop files and obtained from
mimeapps.list) in background.  E.g. xdg-open invokes "gio open" or
kde-open5 for Gnome or KDE accordingly and these handlers launch e.g.
eog or okular in background.  As soon as main process exits, temporary
terminal session created by `start-process-shell-command' is terminated.
As a result background processes receive SIGHUP.

Previously command were executed with no buffer as well, so the change
does not affect "needsterminal" and "copiousoutput" mailcap features,
they are not supported as earlier.

If main process of the handler fails then show a message with exit
reason.  Output (including error messages) is ignored as before.
Gtk applications tend to report significant amount of failed asserts
hardly informative for majority of users (bug#12972).

Copyright-paperwork-exempt: yes

lisp/net/mailcap.el

index 54f7f416abad0b75742e061b041ffa50c8d2a96c..f64897ac9b9d8cb5da4c71ca3b4e3d97e72be2a5 100644 (file)
@@ -1177,7 +1177,25 @@ See \"~/.mailcap\", `mailcap-mime-data' and related files and variables."
                   (shell-quote-argument (convert-standard-filename file))
                   command
                   nil t))
-    (start-process-shell-command command nil command)))
+    ;; Handlers such as "gio open" and kde-open5 start viewer in background
+    ;; and exit immediately.  Avoid `start-process' since it assumes
+    ;; :connection-type `pty' and kills children processes with SIGHUP
+    ;; when temporary terminal session is finished (Bug#44824).
+    ;; An alternative is `process-connection-type' let-bound to nil for
+    ;; `start-process-shell-command' call (with no chance to report failure).
+    (make-process
+     :name "mailcap-view-file"
+     :connection-type 'pipe
+     :noquery t
+     :buffer nil ; "*Messages*" may be suitable for debugging
+     :sentinel (lambda (proc event)
+                 (when (and (memq (process-status proc) '(exit signal))
+                            (/= (process-exit-status proc) 0))
+                   (message
+                    "Command %s: %s."
+                    (mapconcat #'identity (process-command proc) " ")
+                    (substring event 0 -1))))
+     :command (list shell-file-name shell-command-switch command))))
 
 (provide 'mailcap)