natalie
natalie copied to clipboard
Support abstract namespaces with UNIX sockets
Another one for the long list of things I want to do: abstract namespaces for UNIX sockets.
A selective copy-paste from https://www.man7.org/linux/man-pages/man7/unix.7.html:
an abstract socket address is distinguished (from a pathname socket) by the fact that sun_path[0] is a null byte ('\0'). The socket's address in this namespace is given by the additional bytes in sun_path that are covered by the specified length of the address structure. (Null bytes in the name have no special significance.) The name has no connection with filesystem pathnames. When the address of an abstract socket is returned, the returned addrlen is greater than sizeof(sa_family_t) (i.e., greater than 2), and the name of the socket is contained in the first (addrlen - sizeof(sa_family_t)) bytes of sun_path.
A simple example in Ruby:
require 'socket'
path = "\x00abstract"
server = UNIXServer.new(path)
client = UNIXSocket.new(path)
client.write("Hello")
socket = server.accept
puts socket.recvfrom(5).first
socket.close
client.close
server.close
I completely skipped this for now to get the specs passing, but we should support this too. And preferably write some specs for them as well.