Hello,

While running the Shepherd on the Hurd, I stumbled upon this:

--8<---------------cut here---------------start------------->8---
System lacks support for 'signalfd'; using fallback mechanism.
shepherd[1]: GNU Shepherd 1.0.4 (Guile 3.0.9, i586-pc-gnu)
shepherd[1]: Starting service root...
shepherd[1]: Service root started.
shepherd[1]: Service root running with value #<<process> id: 1 command: #f>.
shepherd[1]: Service root has been started.
shepherd[1]: starting services...
shepherd[1]: Configuration successfully loaded from 
'/gnu/store/giw6z1y2kssq1d7dplxp5i1fawjfabmp-shepherd.conf'.
shepherd[1]: Starting service pam...
shepherd[1]: Starting service user-file-systems...
shepherd[1]: Starting service root-file-system...
shepherd[1]: Starting service loopback...
shepherd[1]: Starting service networking...
shepherd[1]: Service pam started.
shepherd[1]: Service user-file-systems started.
shepherd[1]: Service root-file-system started.
shepherd[1]: Service pam running with value #t.
shepherd[1]: Service pam has been started.
shepherd[1]: Service user-file-systems running with value #t.
shepherd[1]: Service user-file-systems has been started.
shepherd[1]: Service root-file-system running with value #t.
shepherd[1]: Service root-file-system has been started.
Uncaught exception in task:
In fibers.scm:
    172:8  7 (_)
In shepherd/service/system-log.scm:
    240:7  6 (run-system-log #<<channel> getq: #<atomic-box 33088d0?> ?)
In ice-9/suspendable-ports.scm:
   681:11  5 (read-delimited _ _ _)
    613:2  4 (read-char _)
   184:27  3 (fill-input #<input: /dev/klog 44> _ _)
     72:4  2 (read-bytes #<input: /dev/klog 44> #vu8(51 98 120 121 ?) ?)
In unknown file:
           1 (port-read #<input: /dev/klog 44> #vu8(51 98 120 121 ?) ?)
In ice-9/boot-9.scm:
  1685:16  0 (raise-exception _ #:continuable? _)
ice-9/boot-9.scm:1685:16: In procedure raise-exception:
In procedure fport_read: (os/device) operation would block
--8<---------------cut here---------------end--------------->8---

What happens here is that reading from /dev/klog (opened with
O_NONBLOCK) returns ED_WOULD_BLOCK.  However Guile and its concurrency
framework (Fibers) don’t know about this error, hence the (non-fatal)
backtrace, but they do know about EAGAIN and EWOULDBLOCK.

What do you think of the patch below?

Thanks,
Ludo’.

diff --git a/trans/streamio.c b/trans/streamio.c
index e42ff908..cdc0af40 100644
--- a/trans/streamio.c
+++ b/trans/streamio.c
@@ -1011,7 +1011,13 @@ dev_read (size_t amount, void **buf, size_t *len, int nowait)
     {
       err = start_input (nowait);
       if (err)
-	return err;
+	{
+	  if (err == ED_WOULD_BLOCK)
+	    /* Return a POSIX error code that the client is more likely to
+	       handle properly.  */
+	    err = EAGAIN;
+	  return err;
+	}
 
       if (eof)
 	{

Reply via email to