Hi Heikki, On Mon, Feb 16, 2026 at 09:51:00AM +0200, Heikki Linnakangas wrote: > On 15/02/2026 10:11, Michael Banck wrote: > > On Tue, Oct 08, 2024 at 12:55:00AM +0300, Heikki Linnakangas wrote: > > > In the meanwhile, here is a one more version of the test patches, with a > > > SKIP that checks that IO::Socket::UNIX works. > > > > I've only realized recently, but those postmaster tap tests have been > > failing during Debian package build (see e.g. [0]) on hurd-i386/amd64 with > > > > |send: Cannot determine peer address at t/002_connection_limits.pl line 136. > > > > This wasn't widely noticed because both architectures are on the (not > > small) list of arches where test suite failures are ignored[1] but I > > think nowadays it is the only (or one of the very few) remaining > > issue(s). I encountered it now when I tried to turn on > > --enable-tap-tests on fruitcrow. > > > > The Perl code run through strace shows it runs connect(), then > > getpeername() and then sendto(), as seen here[2]. However, getpeername() > > on Unix sockets is not implemented on the Hurd yet[3] (granted, FSVO > > "yet", the issue is 20 years old). I've opened an issue in Perl asking > > to work around this here: https://github.com/Perl/perl5/issues/24195 > > > > Would something like the attached be acceptable in the interim to have > > this test be skipped on the Hurd as well? > > Hmm, so is the "$sock->send('foo');" actually necessary, if the error occurs > on getpeername() already? Where does the getpeername() call come from?
I wasn't very clear in my last message, this is the send() code in Perl (see https://github.com/Perl/perl5/blob/blead/dist/IO/lib/IO/Socket.pm#L294): |sub send { | @_ >= 2 && @_ <= 4 or croak 'usage: $sock->send(BUF, [FLAGS, [TO]])'; | my $sock = $_[0]; | my $flags = $_[2] || 0; | my $peer; | | if ($_[3]) { | # the caller explicitly requested a TO, so use it | # this is non-portable for "connected" UDP sockets | $peer = $_[3]; | } | elsif (!defined getpeername($sock)) { | # we're not connected, so we require a peer from somewhere | $peer = $sock->peername; | | croak 'send: Cannot determine peer address' | unless(defined $peer); | } | | my $r = $peer | ? send($sock, $_[1], $flags, $peer) | : send($sock, $_[1], $flags); | | # remember who we send to, if it was successful | ${*$sock}{'io_socket_peername'} = $peer | if(@_ == 4 && defined $r); | | $r; |} So if we don't give send() a third argument, it runs getpeername() on the socket. I have the feeling it is unncessary to require a peer for local Unix sockets and have suggested that now in the Perl issue. > It would be nice to silence that failure one way or another. If we go with > this approach, would need a comment at least to explain it. Right. > It seems a little awkward to send garbage to the server for this. Could we > replace the send() with a non-blocking recv() or something? I am not quite sure how this would look like? Thanks, Michael
