www.fabiankeil.de/blog-surrogat/2021/02/22/gatling-und-electrobsd.html

gatling und ElectroBSD

Zu Testzwecken wollte ich kürzlich gatling auf ElectroBSD installieren, musste aber feststellen, dass der FreeBSD-Port veraltet ist.

Außerdem warf der Compiler einen Haufen hässlicher Warnungen. Eine kleine Auswahl:

=>> Status   www/gatling | gatling-0.15_2: build
=======================<phase: build          >============================
===>  Building for gatling-0.15_2
gmake[1]: Entering directory '/wrkdirs/usr/ports/www/gatling/work/gatling-0.15'
rm -f havesetresuid.h
(head -n 1 CHANGES | sed 's/\([^:]*\):/#define VERSION "\1"/') > version.h
if  cc -O2 -pipe  -I/usr/local/include/libowfat -I/usr/local/include -I/usr/local/include -g -fstack-protector-strong -fno-strict-aliasing  -g -Og -DUSE_ZLIB -o tryresuid trysetresuid.c >/dev/null 2>&1; then echo "#define LI
BC_HAS_SETRESUID"; fi > havesetresuid.h
rm -f havealloca.h
echo "#include <stdlib.h>" > havealloca.h
if   cc -O2 -pipe  -I/usr/local/include/libowfat -I/usr/local/include -I/usr/local/include -g -fstack-protector-strong -fno-strict-aliasing  -g -Og -DUSE_ZLIB -c tryalloca.c -DA >/dev/null 2>&1; then echo "#include <alloca.h
>"; fi >> havealloca.h
if   cc -O2 -pipe  -I/usr/local/include/libowfat -I/usr/local/include -I/usr/local/include -g -fstack-protector-strong -fno-strict-aliasing  -g -Og -DUSE_ZLIB -c tryalloca.c -DB >/dev/null 2>&1; then echo "#include <malloc.h
>"; fi >> havealloca.h
rm -f tryalloca.o
cc -c mime.c -o mime.o -I. -O2 -pipe  -I/usr/local/include/libowfat -I/usr/local/include -I/usr/local/include -g -fstack-protector-strong -fno-strict-aliasing  -g -Og -DUSE_ZLIB
rm -f tryresuid
cc -c ftp.c -o ftp.o -I. -O2 -pipe  -I/usr/local/include/libowfat -I/usr/local/include -I/usr/local/include -g -fstack-protector-strong -fno-strict-aliasing  -g -Og -DUSE_ZLIB
ftp.c:42:11: warning: implicitly declaring library function 'alloca' with type 'void *(unsigned long)' [-Wimplicit-function-declaration]
  char* x=alloca(l+str_len(s)+5);
          ^
ftp.c:42:11: note: include the header <stdlib.h> or explicitly provide a declaration for 'alloca'
cc -c http.c -o http.o -I. -O2 -pipe  -I/usr/local/include/libowfat -I/usr/local/include -I/usr/local/include -g -fstack-protector-strong -fno-strict-aliasing  -g -Og -DUSE_ZLIB
http.c:121:15: warning: implicitly declaring library function 'alloca' with type 'void *(unsigned long)' [-Wimplicit-function-declaration]
    char* buf=alloca(fmt_urlencoded(0,s,len));
              ^
http.c:121:15: note: include the header <stdlib.h> or explicitly provide a declaration for 'alloca'
http.c:1479:18: warning: implicit declaration of function 'crypt' is invalid in C99 [-Wimplicit-function-declaration]
          char* crypted=crypt(password,map+l+ul+1);
                        ^
http.c:1479:10: warning: incompatible integer to pointer conversion initializing 'char *' with an expression of type 'int' [-Wint-conversion]
          char* crypted=crypt(password,map+l+ul+1);
                ^       ~~~~~~~~~~~~~~~~~~~~~~~~~~
http.c:3278:9: warning: implicitly declaring library function 'vfork' with type 'int (void)' [-Wimplicit-function-declaration]
                int r=vfork();
                      ^
http.c:3278:9: note: include the header <unistd.h> or explicitly provide a declaration for 'vfork'
http.c:3286:40: warning: implicit declaration of function 'chroot' is invalid in C99 [-Wimplicit-function-declaration]
                  if (chroot_to) { chdir(chroot_to); chroot(chroot_to); }
                                                     ^
1 warning generated.

libowfat baut nicht

Um den gatling-Port zu aktualisieren musste erst mal die Abhängigkeit libowfat aktualisiert werden. Der FreeBSD-Port stand noch bei Version 0.31 obwohl Version 0.32 laut Website schon 2018 veröffentlicht wurde.

libowfat 0.32 ließ sich gar nicht ohne Patchen bauen. Erster Versuch:

clang -c io/iom_init.c -O2 -pipe  -O2 -fomit-frame-pointer -g -fstack-protector-strong -fno-strict-aliasing  -pipe -W -Wall -Wextra  -D_REENTRANT -I.
io/iom_init.c:16:9: warning: implicit declaration of function 'fcntl' is invalid in C99 [-Wimplicit-function-declaration]
    if (fcntl(c->ctx,F_SETFD,FD_CLOEXEC) == -1) {
        ^
io/iom_init.c:16:22: error: use of undeclared identifier 'F_SETFD'
    if (fcntl(c->ctx,F_SETFD,FD_CLOEXEC) == -1) {
                     ^
io/iom_init.c:16:30: error: use of undeclared identifier 'FD_CLOEXEC'
    if (fcntl(c->ctx,F_SETFD,FD_CLOEXEC) == -1) {
                             ^
io/iom_init.c:17:7: warning: implicit declaration of function 'close' is invalid in C99 [-Wimplicit-function-declaration]
      close(c->ctx);
      ^
2 warnings and 2 errors generated.
   

Nächster Versuch nach Einbinden der fehlenden Header-Datei:

clang -c textcode/base64url.c -O2 -pipe  -O2 -fomit-frame-pointer -g -fstack-protector-strong -fno-strict-aliasing  -pipe -W -Wall -Wextra  -D_REENTRANT -I.
io/iom_wait.c:68:34: warning: incompatible pointer types passing 'struct kevent (*)[128]' to parameter of type 'struct kevent *' [-Wincompatible-pointer-types]
      int r=kevent(c->ctx, 0, 0, &kev, freeslots, &ts);
                                 ^~~~
/usr/include/sys/event.h:320:21: note: passing argument to parameter 'eventlist' here
            struct kevent *eventlist, int nevents,
                           ^
io/iom_wait.c:79:12: error: use of undeclared identifier 'i'
      for (i=0; i<r; ++i) {
           ^
io/iom_wait.c:79:17: error: use of undeclared identifier 'i'
      for (i=0; i<r; ++i) {
                ^
io/iom_wait.c:79:24: error: use of undeclared identifier 'i'
      for (i=0; i<r; ++i) {
                       ^
io/iom_wait.c:81:15: error: use of undeclared identifier 'i'
        int e = (kev[i].filter == EVFILT_READ ? IOM_READ : 0) |
                     ^
io/iom_wait.c:82:15: error: use of undeclared identifier 'i'
                (kev[i].filter == EVFILT_WRITE ? IOM_WRITE : 0);
                     ^
io/iom_wait.c:83:6: error: use of undeclared identifier 'i'
        if (i+1==r) {
            ^
io/iom_wait.c:85:10: error: member reference base type 'struct kevent [128]' is not a structure or union
          *s=kev.ident;
             ~~~^~~~~~
io/iom_wait.c:88:22: error: use of undeclared identifier 'i'
          c->q[c->h].fd=kev[i].ident;
                            ^
1 warning and 8 errors generated.
   

Da hat wohl jemand offensichtlich komplett ungetesteten Code veröffentlicht ...

Nachdem ich auch diese Fehler weggepatcht hatte, habe ich festgestellt, dass die Fehler in CVS bereits behoben wurden ...

Upstream verweigert Mail-Annahme

Keine Ahnung warum es noch kein neues libowfat-Release gibt, die Anfrage beim Upstream wurde abgelehnt:

From: Mail Delivery System <Mailer-Daemon@ispgateway.de>
To: fk@fabiankeil.de
Subject: Mail delivery failed: returning message to sender
Date: Sat, 20 Feb 2021 10:03:00 +0100

This message was created automatically by mail delivery software.

A message that you sent could not be delivered to one or more of its
recipients. This is a permanent error. The following address(es) failed:

  felix@fefe.de
    host a.mx.fefe.de [31.15.64.162]
    SMTP error from remote mail server after RCPT TO:<felix@fefe.de>:
    553-mhh, that does not look good...
    553-let's see what we have here
    553-still no improvement...
    553-mhhh...
    553 sorry, but you are coming from a blacklisted IP range; see www.fefe.de/contact.html (#5.1.8)

Return-path: <fk@fabiankeil.de>
Received: from [217.246.52.33] (helo=fabiankeil.de)
	by smtprelay08.ispgateway.de with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256)
	(Exim 4.92.3)
	(envelope-from <fk@fabiankeil.de>)
	id 1lDO6D-0007y5-QM
	for felix@fefe.de; Sat, 20 Feb 2021 09:58:49 +0100
Date: Sat, 20 Feb 2021 09:58:34 +0100
From: Fabian Keil <fk@fabiankeil.de>
To: Felix von Leitner <felix@fefe.de>
Subject: libowfat 0.32 auf ElectroBSD
Message-ID: <20210220095834.22b89f58@fabiankeil.de>
MIME-Version: 1.0
Content-Type: multipart/encrypted; boundary="Encrypt_/f4Hnv6OZSQANxgpH0NTPknu";
 protocol="application/pgp-encrypted"
X-Df-Sender: MTgwOTA5

Domainfactory scheint mal wieder auf einer Spam-Blacklist gelandet zu sein und ich sollte endlich, wie bereits 2006 angedacht, einen eigenen Mailserver für fabiankeil.de aufsetzen und die Domain umziehen ...

Workaround für fehlerhaften IPv4-Support

gatling 0.16 ließ sich schließlich bauen, hatte aber keinen anständigen IPv4-Support:

fk@t520 /tmp $gatling -i 127.0.0.1 -p 8000
socket_bind6_reuse: Can't assign requested address

Das Problem lässt sich durch Definieren von __broken_itojun_v6__ umgehen, gatling beschwert sich dann allerdings über itojun KAME madness:

fk@t520 /tmp $fk@t520 /tmp $gatling -i 127.0.0.1 -p 8000
WARNING: We are taking heavy losses working around itojun KAME madness here.
         Please consider using an operating system with real IPv6 support instead!

Für meine Testzwecke ist das zum Glück egal. gatling 0.15 hat das gleiche Problem, das Update macht die Sache also nicht schlimmer.

Port-Updates eingereicht

Das devel/libowfat-Update wird als FreeBSD-Bug 253762 geführt, das www/gatling-Update als FreeBSD-Bug 253763.