aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libstore/ssh-store.cc21
1 files changed, 13 insertions, 8 deletions
diff --git a/src/libstore/ssh-store.cc b/src/libstore/ssh-store.cc
index 05992bb49..516648522 100644
--- a/src/libstore/ssh-store.cc
+++ b/src/libstore/ssh-store.cc
@@ -37,6 +37,8 @@ private:
Pid sshMaster;
string uri;
+
+ Path key;
};
SSHStore::SSHStore(string uri, const Params & params, size_t maxConnections)
@@ -44,15 +46,8 @@ SSHStore::SSHStore(string uri, const Params & params, size_t maxConnections)
, RemoteStore(params, maxConnections)
, tmpDir(createTempDir("", "nix", true, true, 0700))
, socketPath((Path) tmpDir + "/ssh.sock")
- , sshMaster(startProcess([&]() {
- auto key = get(params, "ssh-key", "");
- if (key.empty())
- execlp("ssh", "ssh", "-N", "-M", "-S", socketPath.c_str(), uri.c_str(), NULL);
- else
- execlp("ssh", "ssh", "-N", "-M", "-S", socketPath.c_str(), "-i", key.c_str(), uri.c_str(), NULL);
- throw SysError("starting ssh master");
- }))
, uri(std::move(uri))
+ , key(get(params, "ssh-key", ""))
{
}
@@ -92,6 +87,16 @@ ref<FSAccessor> SSHStore::getFSAccessor()
ref<RemoteStore::Connection> SSHStore::openConnection()
{
+ if ((pid_t) sshMaster == -1) {
+ sshMaster = startProcess([&]() {
+ if (key.empty())
+ execlp("ssh", "ssh", "-N", "-M", "-S", socketPath.c_str(), uri.c_str(), NULL);
+ else
+ execlp("ssh", "ssh", "-N", "-M", "-S", socketPath.c_str(), "-i", key.c_str(), uri.c_str(), NULL);
+ throw SysError("starting ssh master");
+ });
+ }
+
auto conn = make_ref<Connection>();
Pipe in, out;
in.create();