1
0
Fork 0
mirror of https://github.com/NixOS/nix synced 2025-06-27 04:21:16 +02:00

Hack to get SSH error messages from build-remote

E.g.

  cannot build on 'ssh://mac1': cannot connect to 'mac1': bash: nix-store: command not found
  cannot build on 'ssh://mac2': cannot connect to 'mac2': Host key verification failed.
  cannot build on 'ssh://mac3': cannot connect to 'mac3': Received disconnect from 213... port 6001:2: Too many authentication failures
  Authentication failed.
This commit is contained in:
Eelco Dolstra 2018-03-20 15:17:59 +01:00
parent 78d0c72b52
commit 1aca195e52
No known key found for this signature in database
GPG key ID: 8170B4726D7198DE
4 changed files with 33 additions and 7 deletions

View file

@ -567,21 +567,38 @@ void writeFull(int fd, const string & s, bool allowInterrupts)
}
string drainFD(int fd)
string drainFD(int fd, bool block)
{
StringSink sink;
drainFD(fd, sink);
drainFD(fd, sink, block);
return std::move(*sink.s);
}
void drainFD(int fd, Sink & sink)
void drainFD(int fd, Sink & sink, bool block)
{
int saved;
Finally finally([&]() {
if (!block) {
if (fcntl(fd, F_SETFL, saved) == -1)
throw SysError("making file descriptor blocking");
}
});
if (!block) {
saved = fcntl(fd, F_GETFL);
if (fcntl(fd, F_SETFL, saved | O_NONBLOCK) == -1)
throw SysError("making file descriptor non-blocking");
}
std::vector<unsigned char> buf(4096);
while (1) {
checkInterrupt();
ssize_t rd = read(fd, buf.data(), buf.size());
if (rd == -1) {
if (!block && (errno == EAGAIN || errno == EWOULDBLOCK))
break;
if (errno != EINTR)
throw SysError("reading from file");
}

View file

@ -151,9 +151,9 @@ MakeError(EndOfFile, Error)
/* Read a file descriptor until EOF occurs. */
string drainFD(int fd);
string drainFD(int fd, bool block = true);
void drainFD(int fd, Sink & sink);
void drainFD(int fd, Sink & sink, bool block = true);
/* Automatic cleanup of resources. */