about summary refs log tree commit diff
diff options
context:
space:
mode:
authorProfpatsch <mail@profpatsch.de>2019-12-12T14·15+0100
committerEelco Dolstra <edolstra@gmail.com>2020-04-10T08·45+0200
commit7afd8321edbf94d19caa76b668133ae3d0e58eb3 (patch)
treefef20a6800ce7175fcf2f49a323c9d33097e1eab
parent2007b4a89beca10326c6d94c7763d607eacc7710 (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
```

(cherry picked from commit 38b29fb72ca4a07afbec1fd5067f59ca7d7f0fab)
-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 5e0e44935cca..2533e26e8925 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;