From 26b3a1b9ce526b14d92666695c2b712b2d025d15 Mon Sep 17 00:00:00 2001 From: Jade Lovelace Date: Wed, 29 May 2024 15:56:32 -0700 Subject: [PATCH] unix-domain-socket.cc: add comment explaining why bindConnectProcHelper We reviewed this code a while ago, and we neglected to get a comment in saying why it's Like This at the time. Let's fix that, since it is code that looks very absurd at first glance. Change-Id: Ib67b49605ef9ef1c84ecda1db16be74fc9105398 --- src/libutil/unix-domain-socket.cc | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/libutil/unix-domain-socket.cc b/src/libutil/unix-domain-socket.cc index a9a2a415a..a6e46ca50 100644 --- a/src/libutil/unix-domain-socket.cc +++ b/src/libutil/unix-domain-socket.cc @@ -37,6 +37,17 @@ AutoCloseFD createUnixDomainSocket(const Path & path, mode_t mode) return fdSocket; } +/** + * Workaround for the max length of Unix socket names being between 102 + * (darwin) and 108 (Linux), which is extremely short. This limitation is + * caused by historical restrictions on sizeof(struct sockaddr): + * https://unix.stackexchange.com/a/367012. + * + * Our solution here is to start a process inheriting the socket, chdir into + * the directory of the socket, then connect with just the filename. This is + * rather silly but it works around working directory being process-wide state, + * and is as clearly sound as possible. + */ static void bindConnectProcHelper( std::string_view operationName, auto && operation, int fd, const std::string & path)