[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
master 7faea4a15e: When closing an Eshell process target, send EOF three
From: |
Lars Ingebrigtsen |
Subject: |
master 7faea4a15e: When closing an Eshell process target, send EOF three times |
Date: |
Sun, 26 Jun 2022 12:28:10 -0400 (EDT) |
branch: master
commit 7faea4a15ead8307f59b055cfecba0928a9110c8
Author: Jim Porter <jporterbugs@gmail.com>
Commit: Lars Ingebrigtsen <larsi@gnus.org>
When closing an Eshell process target, send EOF three times
* lisp/eshell/esh-io.el (eshell-close-target): Send EOF 3 times.
* test/lisp/eshell/em-extpipe-tests.el (em-extpipe-tests--deftest):
Re-enable these tests on EMBA.
This patch is adapted by one from Ken Brown, who uncovered the reason
for this bug (bug#56025).
---
lisp/eshell/esh-io.el | 16 ++++++++++++++--
test/lisp/eshell/em-extpipe-tests.el | 1 -
2 files changed, 14 insertions(+), 3 deletions(-)
diff --git a/lisp/eshell/esh-io.el b/lisp/eshell/esh-io.el
index 3644c1a18b..c035890ddf 100644
--- a/lisp/eshell/esh-io.el
+++ b/lisp/eshell/esh-io.el
@@ -276,8 +276,20 @@ STATUS should be non-nil on successful termination of the
output."
;; If we're redirecting to a process (via a pipe, or process
;; redirection), send it EOF so that it knows we're finished.
((eshell-processp target)
- (if (eq (process-status target) 'run)
- (process-send-eof target)))
+ ;; According to POSIX.1-2017, section 11.1.9, sending EOF causes
+ ;; all bytes waiting to be read to be sent to the process
+ ;; immediately. Thus, if there are any bytes waiting, we need to
+ ;; send EOF twice: once to flush the buffer, and a second time to
+ ;; cause the next read() to return a size of 0, indicating
+ ;; end-of-file to the reading process. However, some platforms
+ ;; (e.g. Solaris) actually require sending a *third* EOF. Since
+ ;; sending extra EOFs while the process is running shouldn't break
+ ;; anything, we'll just send the maximum we'd ever need. See
+ ;; bug#56025 for further details.
+ (let ((i 0))
+ (while (and (<= (cl-incf i) 3)
+ (eq (process-status target) 'run))
+ (process-send-eof target))))
;; A plain function redirection needs no additional arguments
;; passed.
diff --git a/test/lisp/eshell/em-extpipe-tests.el
b/test/lisp/eshell/em-extpipe-tests.el
index 3b84d763ac..29f5dc0551 100644
--- a/test/lisp/eshell/em-extpipe-tests.el
+++ b/test/lisp/eshell/em-extpipe-tests.el
@@ -71,7 +71,6 @@
(skip-unless shell-file-name)
(skip-unless shell-command-switch)
(skip-unless (executable-find shell-file-name))
- (skip-unless (not (getenv "EMACS_EMBA_CI")))
(let ((input ,input))
(with-temp-eshell ,@body)))))
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- master 7faea4a15e: When closing an Eshell process target, send EOF three times,
Lars Ingebrigtsen <=