* sockaddr_un doesn't allow path names of more than 108 characters.
This isn't usually a problem, except that it causes tests to fail when performed in a directory with a very long path name. So chdir to the socket directory and use a relative path name.
This commit is contained in:
parent
f8985d195e
commit
72034ab35d
2 changed files with 26 additions and 6 deletions
|
@ -137,14 +137,26 @@ void RemoteStore::connectToDaemon()
|
||||||
|
|
||||||
string socketPath = nixStateDir + DEFAULT_SOCKET_PATH;
|
string socketPath = nixStateDir + DEFAULT_SOCKET_PATH;
|
||||||
|
|
||||||
|
/* 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. !!! this is probably a bad idea in multi-threaded
|
||||||
|
applications... */
|
||||||
|
AutoCloseFD fdPrevDir = open(".", O_RDONLY);
|
||||||
|
if (fdPrevDir == -1) throw SysError("couldn't open current directory");
|
||||||
|
chdir(dirOf(socketPath).c_str());
|
||||||
|
Path socketPathRel = "./" + baseNameOf(socketPath);
|
||||||
|
|
||||||
struct sockaddr_un addr;
|
struct sockaddr_un addr;
|
||||||
addr.sun_family = AF_UNIX;
|
addr.sun_family = AF_UNIX;
|
||||||
if (socketPath.size() >= sizeof(addr.sun_path))
|
if (socketPathRel.size() >= sizeof(addr.sun_path))
|
||||||
throw Error(format("socket path `%1%' is too long") % socketPath);
|
throw Error(format("socket path `%1%' is too long") % socketPathRel);
|
||||||
strcpy(addr.sun_path, socketPath.c_str());
|
strcpy(addr.sun_path, socketPathRel.c_str());
|
||||||
|
|
||||||
if (connect(fdSocket, (struct sockaddr *) &addr, sizeof(addr)) == -1)
|
if (connect(fdSocket, (struct sockaddr *) &addr, sizeof(addr)) == -1)
|
||||||
throw SysError(format("cannot connect to daemon at `%1%'") % socketPath);
|
throw SysError(format("cannot connect to daemon at `%1%'") % socketPath);
|
||||||
|
|
||||||
|
if (fchdir(fdPrevDir) == -1)
|
||||||
|
throw SysError("couldn't change back to previous directory");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -542,11 +542,17 @@ static void daemonLoop()
|
||||||
|
|
||||||
createDirs(dirOf(socketPath));
|
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;
|
struct sockaddr_un addr;
|
||||||
addr.sun_family = AF_UNIX;
|
addr.sun_family = AF_UNIX;
|
||||||
if (socketPath.size() >= sizeof(addr.sun_path))
|
if (socketPathRel.size() >= sizeof(addr.sun_path))
|
||||||
throw Error(format("socket path `%1%' is too long") % socketPath);
|
throw Error(format("socket path `%1%' is too long") % socketPathRel);
|
||||||
strcpy(addr.sun_path, socketPath.c_str());
|
strcpy(addr.sun_path, socketPathRel.c_str());
|
||||||
|
|
||||||
unlink(socketPath.c_str());
|
unlink(socketPath.c_str());
|
||||||
|
|
||||||
|
@ -559,6 +565,8 @@ static void daemonLoop()
|
||||||
if (res == -1)
|
if (res == -1)
|
||||||
throw SysError(format("cannot bind to socket `%1%'") % socketPath);
|
throw SysError(format("cannot bind to socket `%1%'") % socketPath);
|
||||||
|
|
||||||
|
chdir("/"); /* back to the root */
|
||||||
|
|
||||||
if (listen(fdSocket, 5) == -1)
|
if (listen(fdSocket, 5) == -1)
|
||||||
throw SysError(format("cannot listen on socket `%1%'") % socketPath);
|
throw SysError(format("cannot listen on socket `%1%'") % socketPath);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue