CI started acting up when Codeberg's Woodpecker stopped having an IPv6 route.
Deeper investigation is pending, but what I think is the trouble and would need to be fixed is that the custom getaddr info variant (that works across platforms even when AI_V6MAPPED is unsupported), and there is no IPv6 loopback address, IPv6 literals are still not let pass through.
Observed behavior on an affected system:
$ ip -6 a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 state UNKNOWN qlen 1000
inet6 ::1/128 scope host proto kernel_lo
valid_lft forever preferred_lft forever
$ ip -6 r
$ socat /dev/null tcp6:localhost:1234 || true
2026/02/18 14:15:50 socat[285] W connect(6, AF=10 [0000:0000:0000:0000:0000:0000:0000:0001]:1234, 28): Connection refused
2026/02/18 14:15:50 socat[285] E tcp6:localhost:1234: Connection refused
$ echo 'import socket; print(await asyncio.get_event_loop().getaddrinfo("::1", 1234, family=socket.AF_UNSPEC, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, flags=socket.AI_ADDRCONFIG))' | python3 -m asyncio
[...]
File "/usr/local/lib/python3.13/socket.py", line 977, in getaddrinfo
for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
socket.gaierror: [Errno -9] Address family for hostname not supported
We're looking up something that is an IP address, so getaddrinfo should never get in our way there.
CI started acting up when Codeberg's Woodpecker stopped having an IPv6 route.
Deeper investigation is pending, but what I think is the trouble and would need to be fixed is that the custom getaddr info variant (that works across platforms even when AI_V6MAPPED is unsupported), and there is no IPv6 loopback address, IPv6 literals are still not let pass through.
Observed behavior on an affected system:
We're looking up something that is an IP address, so getaddrinfo should never get in our way there.