* When NIX_REMOTE=daemon, connect to /nix/var/nix/daemon.socket

instead of forking a worker.
This commit is contained in:
Eelco Dolstra 2006-12-04 14:21:39 +00:00
parent f5f0cf423f
commit 4740baf3a6
3 changed files with 37 additions and 8 deletions

View file

@ -8,6 +8,7 @@
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <sys/un.h>
#include <fcntl.h> #include <fcntl.h>
#include <iostream> #include <iostream>
@ -27,11 +28,14 @@ RemoteStore::RemoteStore()
else if (remoteMode == "daemon") else if (remoteMode == "daemon")
/* Connect to a daemon that does the privileged work for /* Connect to a daemon that does the privileged work for
us. */ us. */
; connectToDaemon();
else else
throw Error(format("invalid setting for NIX_REMOTE, `%1%'") throw Error(format("invalid setting for NIX_REMOTE, `%1%'")
% remoteMode); % remoteMode);
from.fd = fdSocket;
to.fd = fdSocket;
/* Send the magic greeting, check for the reply. */ /* Send the magic greeting, check for the reply. */
try { try {
@ -52,7 +56,7 @@ void RemoteStore::forkSlave()
if (socketpair(AF_UNIX, SOCK_STREAM, 0, sockets) == -1) if (socketpair(AF_UNIX, SOCK_STREAM, 0, sockets) == -1)
throw SysError("cannot create sockets"); throw SysError("cannot create sockets");
fdSelf = sockets[0]; fdSocket = sockets[0];
AutoCloseFD fdChild = sockets[1]; AutoCloseFD fdChild = sockets[1];
/* Start the worker. */ /* Start the worker. */
@ -80,7 +84,7 @@ void RemoteStore::forkSlave()
if (dup2(fdChild, STDIN_FILENO) == -1) if (dup2(fdChild, STDIN_FILENO) == -1)
throw SysError("dupping read side"); throw SysError("dupping read side");
close(fdSelf); close(fdSocket);
close(fdChild); close(fdChild);
int fdDebug = open("/tmp/worker-log", O_WRONLY | O_CREAT | O_TRUNC, 0644); int fdDebug = open("/tmp/worker-log", O_WRONLY | O_CREAT | O_TRUNC, 0644);
@ -104,15 +108,33 @@ void RemoteStore::forkSlave()
fdChild.close(); fdChild.close();
from.fd = fdSelf; }
to.fd = fdSelf;
void RemoteStore::connectToDaemon()
{
fdSocket = socket(PF_UNIX, SOCK_STREAM, 0);
if (fdSocket == -1)
throw SysError("cannot create Unix domain socket");
string socketPath = nixStateDir + DEFAULT_SOCKET_PATH;
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 (connect(fdSocket, (struct sockaddr *) &addr, sizeof(addr)) == -1)
throw SysError(format("cannot connect to daemon at `%1%'") % socketPath);
} }
RemoteStore::~RemoteStore() RemoteStore::~RemoteStore()
{ {
try { try {
fdSelf.close(); fdSocket.close();
if (child != -1)
child.wait(true); child.wait(true);
} catch (Error & e) { } catch (Error & e) {
printMsg(lvlError, format("error (ignored): %1%") % e.msg()); printMsg(lvlError, format("error (ignored): %1%") % e.msg());

View file

@ -52,7 +52,7 @@ public:
void syncWithGC(); void syncWithGC();
private: private:
AutoCloseFD fdSelf; AutoCloseFD fdSocket;
FdSink to; FdSink to;
FdSource from; FdSource from;
Pid child; Pid child;
@ -60,6 +60,8 @@ private:
void processStderr(); void processStderr();
void forkSlave(); void forkSlave();
void connectToDaemon();
}; };

View file

@ -28,4 +28,9 @@ typedef enum {
#define STDERR_ERROR 0x63787470 #define STDERR_ERROR 0x63787470
/* The default location of the daemon socket, relative to
nixStateDir. */
#define DEFAULT_SOCKET_PATH "/daemon.socket"
#endif /* !__WORKER_PROTOCOL_H */ #endif /* !__WORKER_PROTOCOL_H */