• Daniel Black's avatar
    MDEV-15655: Add Linux abstract socket support · 08098366
    Daniel Black authored
    The functionality of the socket system variable is extended
    here such that a preciding '@' indicates that the socket
    will be an abstract socket. Thie socket name wil be
    the remainder of the name after the '@'. This is consistent
    with the approached used by systemd in socket activation.
    
    Thanks to Sergey Vojtovich:
    
    On OS X sockaddr_un is defined as:
    
    struct sockaddr_un
    {
      u_char sun_len;
      u_char sun_family;
      char  sun_path[104];
    };
    
    There is a comment in man 7 unix (on linux):
    
    "
    On Linux, the above offsetof() expression equates to the same value as sizeof(sa_family_t),
    but some other implementations include other fields before sun_path, so the offsetof()
    expression more portably describes the size of the address structure.
    "
    
    As such, use the offsetof for Linux and use the previous sizeof(UNIXaddr)
    for non-unix platforms as that's what worked before and they don't
    support abstract sockets so there's no compatibility problem..
    
    strace -fe trace=networking mysqld --skip-networking --socket @abc ...
    ...
    [pid 10578] socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC, 0) = 22
    [pid 10578] setsockopt(22, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
    [pid 10578] bind(22, {sa_family=AF_UNIX, sun_path=@"abc"}, 6) = 0
    [pid 10578] listen(22, 80)              = 0
    ...
    Version: '10.3.6-MariaDB-log'  socket: '@abc'  port: 0  Source distribution
    
    $ lsof -p 10578
    mysqld  10578  dan   22u  unix 0x00000000087e688c       0t0 4787815 @abc type=STREAM
    08098366
mysqltest.cc 291 KB