GNU bug report logs - #77943
[PATCH 0/2] Using the Shepherd's system log on the Hurd

Previous Next

Package: guix-patches;

Reported by: Ludovic Courtès <ludo <at> gnu.org>

Date: Sun, 20 Apr 2025 15:54:02 UTC

Severity: normal

Tags: patch

Full log


Message #38 received at 77943 <at> debbugs.gnu.org (full text, mbox):

From: yelninei <at> tutamail.com
To: Ludovic Courtès <ludo <at> gnu.org>
Cc: 77943 <77943 <at> debbugs.gnu.org>
Subject: Re: [PATCH 1/2] services: shepherd: Provide the right
 #:kernel-log-file on the Hurd.
Date: Sun, 17 Aug 2025 20:46:44 +0200 (CEST)
Hi.
Aug 17, 2025, 15:19 by ludo <at> gnu.org:

>
>
> So you have a patch for /hurd/streamio and a C reproducer?  (Maybe you
> sent it already and I haven’t seen.)
>
No i have not sent this:
Something like this fixes the D_WOULD_BLOCK errno.
--8<---------------cut here---------------start------------->8---
diff --git a/trans/streamio.c b/trans/streamio.c
index e42ff908..93057146 100644
--- a/trans/streamio.c
+++ b/trans/streamio.c
@@ -1049,6 +1049,8 @@ device_read_reply_inband (mach_port_t reply, kern_return_t errorcode,
 
   input_pending = 0;
   err = errorcode;
+  if (err == D_WOULD_BLOCK)
+    err = EWOULDBLOCK;
   if (!err)
     {
       if (datalen == 0)
--8<---------------cut here---------------end--------------->8---


Some c code that runs fgets in a loop until an error
--8<---------------cut here---------------start------------->8---
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>


#define _PATH_KLOG "/dev/klog"

int
main ()
{

  ssize_t n;
  int fd;
 
  fd = open(_PATH_KLOG, O_RDONLY | O_NONBLOCK | O_CLOEXEC);

  if (fd < 0)
    {
      perror("open");
      exit(EXIT_FAILURE);
    }

  FILE* file = fdopen(fd, "r");
  
  char* line;
  int line_max = 1024;

  line = malloc(line_max +1);

  if(line == NULL)
    {
      perror("malloc");
      exit(EXIT_FAILURE);
    }

  // The first read always fails with EWOUDLBLOCK
  fgets(line, line_max +1 , file);
  perror("fgets");
  errno = 0;
  while(fgets(line, line_max +1 , file) != NULL)
    {
      printf("%s", line);
    }
  perror("fgets");
  
  free(line);
  close(fd);
  exit(EXIT_SUCCESS);
}
--8<---------------cut here---------------end--------------->8---

I am using `(cross-gcc-toolchain "i586-pc-gnu")` to get a cross compiler with a bit of a hack to remove the %hurd-system supported-system restriction from the hurd and mach headers.



>> However this does not really help the shepherd syslog because guile's
>> read-line blocks forever waiting for a terminating newline. Also guile
>> is unaware that further attempts to read would EWOULDBLOCK as "(select
>> (vector port) #() #() 0)" indicates that reading is possible but then
>> actually trying to a get a char blocks.
>>
>
> Ah but I think that’s fine: shepherd, suspendable ports are enabled (via
> Fibers), which means that read attempts that return EAGAIN or
> EWOULDBLOCK result in the calling fiber being suspended.
>
> You would need to try this for real, but it should be fine.
>

It is fine in the sense that fibers suspends the system-log successfully at the "end" of /dev/klog.
However It is not fine because it will never wake up it up again. 
According to the c example it now returns EWOULDBLOCK as expected.From testing around a bit I think it might be (@ (ice-9 rdelim) read-line) waiting for a terminating newline.
And again when I retried this just now there was the noticable delay with anything shepherd when the shepherd-syslog is running (default (system-log-configuration) configuration)


> Thanks!
>
> Ludo’.
>





This bug report was last modified 28 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.