All of lore.kernel.org
 help / color / mirror / Atom feed
* IWD 2.9 Does Not Compile against Linux-4.9.212 and/or GLibC-2.28
@ 2023-11-26 22:21 Grant Erickson
  2023-11-27  3:25 ` Denis Kenzior
  0 siblings, 1 reply; 4+ messages in thread
From: Grant Erickson @ 2023-11-26 22:21 UTC (permalink / raw)
  To: iwd; +Cc: Marcel Holtmann, Denis Kenzior

IWD Community:

Over on the connman and ell mailing lists, Marcel and Denis have been advocating, rightly so, for iwd over wpa_supplicant for Wi-Fi.

Is there a kernel version expectation of IWD?

For the current project I am engaged on, the kernel is locked at linux-4.9.212, glibc-2.28, and GCC 8.2. With that combination, I have found any reasonably modern version of IWD fails to build.

Denis and Marcel expediently put in place a few patches to make ell-0.61 compile. I suspect a similar set of patches for ell are also applicable to iwd:

    make[1]: Entering directory '${BuildRoot}/third_party/iwd/.build/Makefile/${PRODUCT}/arm/gnu-toolchain/12.3.1/release'
      GEN      ell/shared
      GEN      src/builtin.h
    make --no-print-directory all-am
      CC       client/main.o
      CC       client/adapter.o
      CC       client/agent.o
      CC       client/agent-manager.o
      CC       client/ad-hoc.o
      CC       client/ap.o
      CC       client/command.o
      CC       client/dbus-proxy.o
      CC       client/device.o
      CC       client/display.o
      CC       client/known-networks.o
    ${BuildRoot}/third_party/iwd/iwd-2.9/client/known-networks.c:27: warning: "_XOPEN_SOURCE" redefined
       27 | #define _XOPEN_SOURCE
          | 
    <command-line>: note: this is the location of the previous definition
    ${BuildRoot}/third_party/iwd/iwd-2.9/client/display.c: In function ‘display_init’:
    ${BuildRoot}/third_party/iwd/iwd-2.9/client/display.c:949:44: warning: assignment to ‘void (*)(void)’ from incompatible pointer type ‘void (*)(char **, int,  int)’ [-Wincompatible-pointer-types]
      949 |         rl_completion_display_matches_hook = display_completion_matches;
          |                                            ^
      CC       client/network.o
      CC       client/properties.o
      CC       client/wsc.o
      CC       client/station.o
      CC       client/diagnostic.o
      CC       client/daemon.o
      CC       client/dpp.o
      CC       client/dpp-pkex.o
      CC       client/station-debug.o
      CC       src/util.o
      CC       src/band.o
      CC       monitor/main.o
      CC       monitor/nlmon.o
      CC       monitor/pcap.o
      CC       monitor/display.o
      CC       src/ie.o
      CC       src/wscutil.o
      CC       src/mpdu.o
      CC       src/crypto.o
      CC       src/watchlist.o
      CC       src/eapolutil.o
      CC       src/nl80211cmd.o
      CC       src/p2putil.o
      CC       src/anqputil.o
      CC       src/main.o
      CC       src/netdev.o
      CC       src/wiphy.o
      CC       src/device.o
      CC       src/station.o
      CC       src/dbus.o
      CC       src/eapol.o
      CC       src/handshake.o
      CC       src/scan.o
      CC       src/common.o
      CC       src/agent.o
      CC       src/storage.o
      CC       src/network.o
      CC       src/wsc.o
      CC       src/backtrace.o
      CC       src/knownnetworks.o
      CC       src/rfkill.o
      CC       src/ft.o
      CC       src/ap.o
      CC       src/adhoc.o
      CC       src/sae.o
    In file included from ${BuildRoot}/third_party/iwd/iwd-2.9/src/adhoc.c:28:
    ${BuildRoot}/results/${PRODUCT}/arm/gnu-toolchain/12.3.1/release/third_party/linux/linux-dey/include/linux/if.h:234:34: error: field ‘ifru_addr’ has incomplete type
      234 |                 struct  sockaddr ifru_addr;
          |                                  ^~~~~~~~~
    ${BuildRoot}/results/${PRODUCT}/arm/gnu-toolchain/12.3.1/release/third_party/linux/linux-dey/include/linux/if.h:235:34: error: field ‘ifru_dstaddr’ has incomplete type
      235 |                 struct  sockaddr ifru_dstaddr;
          |                                  ^~~~~~~~~~~~
    ${BuildRoot}/results/${PRODUCT}/arm/gnu-toolchain/12.3.1/release/third_party/linux/linux-dey/include/linux/if.h:236:34: error: field ‘ifru_broadaddr’ has incomplete type
      236 |                 struct  sockaddr ifru_broadaddr;
          |                                  ^~~~~~~~~~~~~~
    ${BuildRoot}/results/${PRODUCT}/arm/gnu-toolchain/12.3.1/release/third_party/linux/linux-dey/include/linux/if.h:237:34: error: field ‘ifru_netmask’ has incomplete type
      237 |                 struct  sockaddr ifru_netmask;
          |                                  ^~~~~~~~~~~~
    ${BuildRoot}/results/${PRODUCT}/arm/gnu-toolchain/12.3.1/release/third_party/linux/linux-dey/include/linux/if.h:238:34: error: field ‘ifru_hwaddr’ has incomplete type
      238 |                 struct  sockaddr ifru_hwaddr;
          |                                  ^~~~~~~~~~~
    make[2]: *** [Makefile:2539: src/adhoc.o] Error 1
    make[2]: *** Waiting for unfinished jobs....
    make[1]: *** [Makefile:1713: all] Error 2
    make[1]: Leaving directory '${BuildRoot}/third_party/iwd/.build/Makefile/${PRODUCT}/arm/gnu-toolchain/12.3.1/release'
    make: *** [Makefile:110: build] Error 2

I expect the ’sockaddr’ issues to be easily resolved with a different set of include directives; however, the rest appear to be new symbols introduced in later kernels.

Best,

Grant

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: IWD 2.9 Does Not Compile against Linux-4.9.212 and/or GLibC-2.28
  2023-11-26 22:21 IWD 2.9 Does Not Compile against Linux-4.9.212 and/or GLibC-2.28 Grant Erickson
@ 2023-11-27  3:25 ` Denis Kenzior
  2023-11-27 10:25   ` Marcel Holtmann
  2023-11-27 20:35   ` Grant Erickson
  0 siblings, 2 replies; 4+ messages in thread
From: Denis Kenzior @ 2023-11-27  3:25 UTC (permalink / raw)
  To: Grant Erickson, iwd; +Cc: Marcel Holtmann

Hi Grant,

>        CC       client/known-networks.o
>      ${BuildRoot}/third_party/iwd/iwd-2.9/client/known-networks.c:27: warning: "_XOPEN_SOURCE" redefined
>         27 | #define _XOPEN_SOURCE

libreadline adds -D_XOPEN_SOURCE to the gcc command line.  Somehow newer GCC 
versions deal with this transparently and don't raise an error.  Maybe try

#ifndef _XOPEN_SOURCE
#define _XOPEN_SOURCE
#endif

in client/known-networks.c and report back?  I can't duplicate this on my end.

>            |
>      <command-line>: note: this is the location of the previous definition
>      ${BuildRoot}/third_party/iwd/iwd-2.9/client/display.c: In function ‘display_init’:
>      ${BuildRoot}/third_party/iwd/iwd-2.9/client/display.c:949:44: warning: assignment to ‘void (*)(void)’ from incompatible pointer type ‘void (*)(char **, int,  int)’ [-Wincompatible-pointer-types]
>        949 |         rl_completion_display_matches_hook = display_completion_matches;
>            |                                            ^

This one is trickier since the signature of the function we provide is correct 
according to libreadline documentation.  What version of readline are you using?

>        CC       src/adhoc.o
>        CC       src/sae.o
>      In file included from ${BuildRoot}/third_party/iwd/iwd-2.9/src/adhoc.c:28:
>      ${BuildRoot}/results/${PRODUCT}/arm/gnu-toolchain/12.3.1/release/third_party/linux/linux-dey/include/linux/if.h:234:34: error: field ‘ifru_addr’ has incomplete type
>        234 |                 struct  sockaddr ifru_addr;
>            |                                  ^~~~~~~~~
>      ${BuildRoot}/results/${PRODUCT}/arm/gnu-toolchain/12.3.1/release/third_party/linux/linux-dey/include/linux/if.h:235:34: error: field ‘ifru_dstaddr’ has incomplete type
>        235 |                 struct  sockaddr ifru_dstaddr;
>            |                                  ^~~~~~~~~~~~
>      ${BuildRoot}/results/${PRODUCT}/arm/gnu-toolchain/12.3.1/release/third_party/linux/linux-dey/include/linux/if.h:236:34: error: field ‘ifru_broadaddr’ has incomplete type
>        236 |                 struct  sockaddr ifru_broadaddr;
>            |                                  ^~~~~~~~~~~~~~
>      ${BuildRoot}/results/${PRODUCT}/arm/gnu-toolchain/12.3.1/release/third_party/linux/linux-dey/include/linux/if.h:237:34: error: field ‘ifru_netmask’ has incomplete type
>        237 |                 struct  sockaddr ifru_netmask;
>            |                                  ^~~~~~~~~~~~
>      ${BuildRoot}/results/${PRODUCT}/arm/gnu-toolchain/12.3.1/release/third_party/linux/linux-dey/include/linux/if.h:238:34: error: field ‘ifru_hwaddr’ has incomplete type
>        238 |                 struct  sockaddr ifru_hwaddr;
>            |                                  ^~~~~~~~~~~
>      make[2]: *** [Makefile:2539: src/adhoc.o] Error 1
>      make[2]: *** Waiting for unfinished jobs....
>      make[1]: *** [Makefile:1713: all] Error 2
>      make[1]: Leaving directory '${BuildRoot}/third_party/iwd/.build/Makefile/${PRODUCT}/arm/gnu-toolchain/12.3.1/release'
>      make: *** [Makefile:110: build] Error 2

This should be fixed by the patch I just sent out.

Regards,
-Denis

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: IWD 2.9 Does Not Compile against Linux-4.9.212 and/or GLibC-2.28
  2023-11-27  3:25 ` Denis Kenzior
@ 2023-11-27 10:25   ` Marcel Holtmann
  2023-11-27 20:35   ` Grant Erickson
  1 sibling, 0 replies; 4+ messages in thread
From: Marcel Holtmann @ 2023-11-27 10:25 UTC (permalink / raw)
  To: Denis Kenzior; +Cc: Grant Erickson, iwd

Hi Denis,

>>       CC       client/known-networks.o
>>     ${BuildRoot}/third_party/iwd/iwd-2.9/client/known-networks.c:27: warning: "_XOPEN_SOURCE" redefined
>>        27 | #define _XOPEN_SOURCE
> 
> libreadline adds -D_XOPEN_SOURCE to the gcc command line.  Somehow newer GCC versions deal with this transparently and don't raise an error.  Maybe try
> 
> #ifndef _XOPEN_SOURCE
> #define _XOPEN_SOURCE
> #endif
> 
> in client/known-networks.c and report back?  I can't duplicate this on my end.

that is a really odd one, since client/known-networks.c does this correctly.

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#define _XOPEN_SOURCE
#include <time.h>
#include <ell/ell.h>

#include "client/command.h”

So unless something weird ended up in config.h or your CFLAGS, this is impossible.

And yes, thank you readline :(

# pkg-config --cflags readline
-D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600

That is so stupid.

The fun part is actually if I take #define _XOPEN_SOURCE out of the file, it fails for me.

gcc -DHAVE_CONFIG_H -I.      -fvisibility=hidden -DUNITDIR=\""./unit/"\" -DCERTDIR=\""./unit/"\" -DHAVE_PKCS8_SUPPORT -Wall -fsigned-char -fno-exceptions -Werror -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wdeclaration-after-statement -Wmissing-declarations -Wredundant-decls -Wformat -Wformat-security -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -g -fno-PIE -MT client/known-networks.o -MD -MP -MF $depbase.Tpo -c -o client/known-networks.o client/known-networks.c &&\
mv -f $depbase.Tpo $depbase.Po
client/known-networks.c: In function ‘format_iso8601’:
client/known-networks.c:57:9: error: implicit declaration of function ‘strptime’; did you mean ‘strftime’? [-Werror=implicit-function-declaration]
   57 |         strptime(time_str, "%FT%TZ", &tm);
      |         ^~~~~~~~
      |         strftime

So while my pkg-config shows it, it never ends up in the CFLAGS in the end. Maybe some autoconf tools version cleans this up. Or they started to use --cflags-only-I for pkg-config.

These kind of CFLAGS really don’t belong into pkg-config since the manpage of strptime is clear on how to use it.

SYNOPSIS
       #define _XOPEN_SOURCE       /* See feature_test_macros(7) */
       #include <time.h>

       char *strptime(const char *restrict s, const char *restrict format,
                      struct tm *restrict tm);

Actually this can't be the problem and I now remember that I run into this issue before. Our Makefile.am does this:

if LIBEDIT
client_cflags = $(LIBEDIT_CFLAGS)
client_ldadd = $(LIBEDIT_LIBS)
else
client_cflags =
client_ldadd = $(READLINE_LIBS)
endif

I ended up not using $(READLINE_CFLAGS) because of this stupidity of readline. How the duplicate definition of _XOPEN_SOURCE ended up in the build is unclear now. Certainly, not with a vanilla upstream iwd.

>>           |
>>     <command-line>: note: this is the location of the previous definition
>>     ${BuildRoot}/third_party/iwd/iwd-2.9/client/display.c: In function ‘display_init’:
>>     ${BuildRoot}/third_party/iwd/iwd-2.9/client/display.c:949:44: warning: assignment to ‘void (*)(void)’ from incompatible pointer type ‘void (*)(char **, int,  int)’ [-Wincompatible-pointer-types]
>>       949 |         rl_completion_display_matches_hook = display_completion_matches;
>>           |                                            ^
> 
> This one is trickier since the signature of the function we provide is correct according to libreadline documentation.  What version of readline are you using?

And another readline mess. So besides its stupid move to GPLv3, it is also causing all sorts of fun issues for people.

I did add a --enable-libedit option to use libedit instead of readline, but due to our tricks with the refresh of iwctl, that doesn’t seem to fully work as expected. You could give that a try to get iwctl compiled (and worst case use the non-interactive mode). Same as --disable-client which will just not build iwctl at all.

However long-term (or maybe even short-term now) is to get rid of readline. License wise and programmatically it is causing tiny issues that just add up for no real gain.

I wrote my own command line editing that integrates as shell client and would be native to iwd. It is missing tab-completion and won’t work with our refresh tricks. Or I need to try to integrate linenoise since that is self-contained.

Not that I needed more convincing that readline is a problem child, but the arguments against using it keep piling up.

Regards

Marcel


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: IWD 2.9 Does Not Compile against Linux-4.9.212 and/or GLibC-2.28
  2023-11-27  3:25 ` Denis Kenzior
  2023-11-27 10:25   ` Marcel Holtmann
@ 2023-11-27 20:35   ` Grant Erickson
  1 sibling, 0 replies; 4+ messages in thread
From: Grant Erickson @ 2023-11-27 20:35 UTC (permalink / raw)
  To: Denis Kenzior; +Cc: iwd, Marcel Holtmann

On Nov 26, 2023, at 7:25 PM, Denis Kenzior <denkenz@gmail.com> wrote:
>>       CC       client/known-networks.o
>>     ${BuildRoot}/third_party/iwd/iwd-2.9/client/known-networks.c:27: warning: "_XOPEN_SOURCE" redefined
>>        27 | #define _XOPEN_SOURCE
> 
> libreadline adds -D_XOPEN_SOURCE to the gcc command line.  Somehow newer GCC versions deal with this transparently and don't raise an error.  Maybe try
> 
> #ifndef _XOPEN_SOURCE
> #define _XOPEN_SOURCE
> #endif
> 
> in client/known-networks.c and report back?  I can't duplicate this on my end.

I can confirm this is due to my build system. It is asserted in the current build “Frankenbuild” such that I can use the Arm 12.3.1 tool chain that has libasan support against the creaky old glibc-2.28 and linux-4.9.212 which would otherwise introduce clock_{getres,gettime,settime}64. See "-D_POSIX_C_SOURCE=201112L -D_DEFAULT_SOURCE -D_XOPEN_SOURCE” below.

Creating ".build/Makefile/${PRODUCT}/arm/gnu-toolchain/12.3.1/release"
mkdir -p ".build/Makefile/${PRODUCT}/arm/gnu-toolchain/12.3.1/release"
Creating ".build/Makefile/${PRODUCT}/arm/gnu-toolchain/12.3.1/release/Makefile"
cd .build/Makefile/${PRODUCT}/arm/gnu-toolchain/12.3.1/release && \
    PKG_CONFIG_LIBDIR="${BuildRoot}/results/${PRODUCT}/arm/gnu-toolchain/12.3.1/release/third_party/glib/usr/lib/pkgconfig:${BuildRoot}/results/${PRODUCT}/arm/gnu-toolchain/12.3.1/release/third_party/ell/usr/lib/pkgconfig:${BuildRoot}/results/${PRODUCT}/arm/gnu-toolchain/12.3.1/release/third_party/dbus/usr/lib/pkgconfig:${BuildRoot}/results/${PRODUCT}/arm/gnu-toolchain/12.3.1/release/third_party/iwd/usr/lib/pkgconfig:${BuildRoot}/results/${PRODUCT}/arm/gnu-toolchain/12.3.1/release/third_party/nftables/usr/lib/pkgconfig" \
    ${BuildRoot}/third_party/iwd/iwd-2.10/configure -C \
    AR="${SYSROOT}/bin/arm-none-linux-gnueabihf-ar" CPP="${SYSROOT}/bin/arm-none-linux-gnueabihf-cpp" CC="${SYSROOT}/bin/arm-none-linux-gnueabihf-gcc" CXX="${SYSROOT}/bin/arm-none-linux-gnueabihf-g++" RANLIB="${SYSROOT}/bin/arm-none-linux-gnueabihf-ranlib" STRIP="${SYSROOT}/bin/arm-none-linux-gnueabihf-strip" \
    CPPFLAGS="--sysroot=${SYSROOT}/arm-none-linux-gnueabihf/libc -mcpu=cortex-a8 -mfloat-abi=hard -mfpu=neon -D_POSIX_C_SOURCE=201112L -D_DEFAULT_SOURCE -D_XOPEN_SOURCE -isystem ${SYSROOT}/arm-none-linux-gnueabihf/libc/usr/include -I${BuildRoot}/results/${PRODUCT}/arm/gnu-toolchain/12.3.1/release/third_party/linux/linux-dey/include -I${BuildRoot}/results/${PRODUCT}/arm/gnu-toolchain/12.3.1/release/third_party/libnftnl/usr/include -I${BuildRoot}/results/${PRODUCT}/arm/gnu-toolchain/12.3.1/release/third_party/libedit/usr/include" \
    CFLAGS="--sysroot=${SYSROOT}/arm-none-linux-gnueabihf/libc -mcpu=cortex-a8 -mfloat-abi=hard -mfpu=neon  -fno-omit-frame-pointer -fno-strict-aliasing     " \
    LDFLAGS="--sysroot=${SYSROOT}/arm-none-linux-gnueabihf/libc     " \
    ELL_CFLAGS="-I${BuildRoot}/results/${PRODUCT}/arm/gnu-toolchain/12.3.1/release/third_party/ell/usr/include" \
    ELL_LIBS="-L${BuildRoot}/results/${PRODUCT}/arm/gnu-toolchain/12.3.1/release/third_party/ell/usr/lib/ -lell -L${BuildRoot}/results/${PRODUCT}/arm/gnu-toolchain/12.3.1/release/third_party/ell/usr/lib/ -ldl" \
    LIBEDIT_CFLAGS="-I${BuildRoot}/results/${PRODUCT}/arm/gnu-toolchain/12.3.1/release/third_party/libedit/usr/include" \
    LIBEDIT_LIBS="-L${BuildRoot}/results/${PRODUCT}/arm/gnu-toolchain/12.3.1/release/third_party/libedit/usr/lib/ -ledit" \
    --with-sysroot=${SYSROOT}/arm-none-linux-gnueabihf/libc \
    --build=x86_64-pc-linux-gnu \
    --host=arm-dey-linux-gnueabi \
    --target=arm-dey-linux-gnueabi \
    --disable-manual-pages \
    --disable-systemd-service \
    --disable-tools \
    --enable-client \
    --enable-external-ell \
    --enable-libedit \
    --enable-ofono \
    --prefix=/usr \
    --sysconfdir=/etc \
    --localstatedir=/var

>>     <command-line>: note: this is the location of the previous definition
>>     ${BuildRoot}/third_party/iwd/iwd-2.9/client/display.c: In function ‘display_init’:
>>     ${BuildRoot}/third_party/iwd/iwd-2.9/client/display.c:949:44: warning: assignment to ‘void (*)(void)’ from incompatible pointer type ‘void (*)(char **, int,  int)’ [-Wincompatible-pointer-types]
>>       949 |         rl_completion_display_matches_hook = display_completion_matches;
>>           |                                            ^
> 
> This one is trickier since the signature of the function we provide is correct according to libreadline documentation.  What version of readline are you using?

I am using libedit 20221030-3.1 in “readline” compatibility mode. As Marcel has cited elsewhere, it sort of works but has some weirdness on prompt refreshing (as demonstrated on ‘connmanctl’).

>>     In file included from ${BuildRoot}/third_party/iwd/iwd-2.9/src/adhoc.c:28:
>>     ${BuildRoot}/results/${PRODUCT}/arm/gnu-toolchain/12.3.1/release/third_party/linux/linux-dey/include/linux/if.h:234:34: error: field ‘ifru_addr’ has incomplete type
>>       234 |                 struct  sockaddr ifru_addr;
>>           |                                  ^~~~~~~~~
>>     ${BuildRoot}/results/${PRODUCT}/arm/gnu-toolchain/12.3.1/release/third_party/linux/linux-dey/include/linux/if.h:235:34: error: field ‘ifru_dstaddr’ has incomplete type
>>       235 |                 struct  sockaddr ifru_dstaddr;
>>           |                                  ^~~~~~~~~~~~
>>     ${BuildRoot}/results/${PRODUCT}/arm/gnu-toolchain/12.3.1/release/third_party/linux/linux-dey/include/linux/if.h:236:34: error: field ‘ifru_broadaddr’ has incomplete type
>>       236 |                 struct  sockaddr ifru_broadaddr;
>>           |                                  ^~~~~~~~~~~~~~
>>     ${BuildRoot}/results/${PRODUCT}/arm/gnu-toolchain/12.3.1/release/third_party/linux/linux-dey/include/linux/if.h:237:34: error: field ‘ifru_netmask’ has incomplete type
>>       237 |                 struct  sockaddr ifru_netmask;
>>           |                                  ^~~~~~~~~~~~
>>     ${BuildRoot}/results/${PRODUCT}/arm/gnu-toolchain/12.3.1/release/third_party/linux/linux-dey/include/linux/if.h:238:34: error: field ‘ifru_hwaddr’ has incomplete type
>>       238 |                 struct  sockaddr ifru_hwaddr;
>>           |                                  ^~~~~~~~~~~
>>     make[2]: *** [Makefile:2539: src/adhoc.o] Error 1
>>     make[2]: *** Waiting for unfinished jobs....
>>     make[1]: *** [Makefile:1713: all] Error 2
>>     make[1]: Leaving directory '${BuildRoot}/third_party/iwd/.build/Makefile/${PRODUCT}/arm/gnu-toolchain/12.3.1/release'
>>     make: *** [Makefile:110: build] Error 2
> 
> This should be fixed by the patch I just sent out.

Confirmed; I can now build iwd-2.10 against linux-4.9.212 and glibc-2.28 with Arm GNU Toolchain 8.2-2018.11, 10.3-2021.07, 11.3.1, 12.3.1.

Thank you!

Best,

Grant

-- 
Principal
Nuovations

gerickson@nuovations.com
http://www.nuovations.com/


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2023-11-27 20:35 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-11-26 22:21 IWD 2.9 Does Not Compile against Linux-4.9.212 and/or GLibC-2.28 Grant Erickson
2023-11-27  3:25 ` Denis Kenzior
2023-11-27 10:25   ` Marcel Holtmann
2023-11-27 20:35   ` Grant Erickson

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.