aboutsummaryrefslogtreecommitdiff
path: root/src/libstore/ssh.cc
diff options
context:
space:
mode:
authorProfpatsch <mail@profpatsch.de>2019-12-12 15:15:18 +0100
committerProfpatsch <mail@profpatsch.de>2019-12-12 15:32:17 +0100
commit38b29fb72ca4a07afbec1fd5067f59ca7d7f0fab (patch)
treed2abaa5a1cd4814dcf220d84309f14751e3c2d8c /src/libstore/ssh.cc
parentf800d450b78091835ab7ca67847d76e75d877a24 (diff)
libstore/ssh: Improve error message on failing `execvp`
If the `throw` is reached, this means that execvp into `ssh` wasn’t successful. We can hint at a usual problem, which is a missing `ssh` executable. Test with: ``` env PATH= ./result/bin/nix-copy-closure --builders '' unusedhost ``` and the bash version with ``` env PATH= ./result/bin/nix-copy-closure --builders '' localhost ```
Diffstat (limited to 'src/libstore/ssh.cc')
-rw-r--r--src/libstore/ssh.cc8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/libstore/ssh.cc b/src/libstore/ssh.cc
index ac3ccd63d..ddc99a6cd 100644
--- a/src/libstore/ssh.cc
+++ b/src/libstore/ssh.cc
@@ -47,10 +47,13 @@ std::unique_ptr<SSHMaster::Connection> SSHMaster::startCommand(const std::string
throw SysError("duping over stderr");
Strings args;
+ const char * execInto;
if (fakeSSH) {
+ execInto = "bash";
args = { "bash", "-c" };
} else {
+ execInto = "ssh";
args = { "ssh", host.c_str(), "-x", "-a" };
addCommonSSHOpts(args);
if (socketPath != "")
@@ -62,7 +65,8 @@ std::unique_ptr<SSHMaster::Connection> SSHMaster::startCommand(const std::string
args.push_back(command);
execvp(args.begin()->c_str(), stringsToCharPtrs(args).data());
- throw SysError("executing '%s' on '%s'", command, host);
+ // could not exec ssh/bash
+ throw SysError("Failed to exec into %s. Is it in PATH?", execInto);
});
@@ -108,7 +112,7 @@ Path SSHMaster::startMaster()
addCommonSSHOpts(args);
execvp(args.begin()->c_str(), stringsToCharPtrs(args).data());
- throw SysError("starting SSH master");
+ throw SysError("Failed to exec into ssh. Is it in PATH?");
});
out.writeSide = -1;