* When NIX_REMOTE=daemon, connect to /nix/var/nix/daemon.socket
instead of forking a worker.
This commit is contained in:
parent
f5f0cf423f
commit
4740baf3a6
3 changed files with 37 additions and 8 deletions
|
@ -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,16 +108,34 @@ 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();
|
||||||
child.wait(true);
|
if (child != -1)
|
||||||
|
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());
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
Loading…
Reference in a new issue