Hi Willy,

On 08/03/2024 18:01, Willy Tarreau wrote:
The problem with default values is that a single behavior cannot be deduced
from reading a single config statement. That's quite painful for lots of
people (including those who copy config blocks from stackoverflow), and
for API tools. And it works half of the time because internally both modes
work but they can't interoperate with other tools. Here we're really
indicating a new address format. There's nothing wrong with that and we
do have the tools to handle that.

I think that the plan should be:

   - add AF_CUST_ABNS2 to protocol-t.h before AF_CUST_MAX
   - add to str2sa_range() the case for "abns2" just after "abns" with
     address family "AF_CUST_ABNS2", and duplicate the test for
     ss.ss_family == AF_UNIX later for AF_CUST_ABNS2 removing all the
     stuff related to !abstract, or instead, just extend the "if" condition
     to the new family and add that case there as well (might be even easier).
   - duplicate "proto_fam_unix" to "proto_fam_abns2" in sock_unix.c, referencing
     "sock_abns2_addrcmp" for the address comparison
   - duplicate sock_unix_addrcmp() to sock_abns2_addrcmp() and implement only
     the abns case, basically:

        if (a->ss_family != b->ss_family)
                return -1;

        if (a->ss_family != AF_CUST_ABNS2)
                return -1;

        if (au->sun_path[0])
                return -1;

        return memcmp(au->sun_path, bu->sun_path, sizeof(au->sun_path));
   - in sock_unix_bind_receiver(), add a case for this address family in
     the bind() size argument, replacing sizeof(addr) with the string
     length when running AF_CUST_ABNS2.

   - for get_addr_len() I need to think :-/  I actually don't know how
     that one works with socketpairs already, so there might be a trick
     I'm overlooking.

Alright. I will look at how that looks and report back shortly.

I need to leave now, but I continue to think that if there is any internal
shortcoming, we should not try to work around it at the expense of trickier
long-term maintenance, instead we should address it. And don't worry, I'm
not going to assign you the task of dealing with limited stuff. We may end
up with the workaround in the worst case if we don't find better, but that
would mean declaring a failure and having to break that stuff sometime in
the future, which is always a pain.

To be honest, I don't think this is unfixable. It's just a matter of how much code change we think is acceptable for it. If push comes to shove, one can always add an extra field somewhere, or an extra arg in get_addr_len, even if it'd be a little ugly.

Tristan

Reply via email to