diff options
Diffstat (limited to 'src/nix-worker/nix-worker.cc')
-rw-r--r-- | src/nix-worker/nix-worker.cc | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/src/nix-worker/nix-worker.cc b/src/nix-worker/nix-worker.cc index 4aab03fcd685..d9b75270f843 100644 --- a/src/nix-worker/nix-worker.cc +++ b/src/nix-worker/nix-worker.cc @@ -542,11 +542,17 @@ static void daemonLoop() createDirs(dirOf(socketPath)); + /* Urgh, sockaddr_un allows path names of only 108 characters. So + chdir to the socket directory so that we can pass a relative + path name. */ + chdir(dirOf(socketPath).c_str()); + Path socketPathRel = "./" + baseNameOf(socketPath); + struct sockaddr_un addr; addr.sun_family = AF_UNIX; - if (socketPath.size() >= sizeof(addr.sun_path)) - throw Error(format("socket path `%1%' is too long") % socketPath); - strcpy(addr.sun_path, socketPath.c_str()); + if (socketPathRel.size() >= sizeof(addr.sun_path)) + throw Error(format("socket path `%1%' is too long") % socketPathRel); + strcpy(addr.sun_path, socketPathRel.c_str()); unlink(socketPath.c_str()); @@ -559,6 +565,8 @@ static void daemonLoop() if (res == -1) throw SysError(format("cannot bind to socket `%1%'") % socketPath); + chdir("/"); /* back to the root */ + if (listen(fdSocket, 5) == -1) throw SysError(format("cannot listen on socket `%1%'") % socketPath); |