mirror of
https://github.com/NixOS/nix.git
synced 2025-12-22 17:01:08 +01:00
Fix select / fdset usage on Windows
These functions use `SOCKET` not `int`, despite them being unix functions.
This commit is contained in:
parent
79750a3ccc
commit
208ed3c538
2 changed files with 11 additions and 10 deletions
|
|
@ -1,6 +1,7 @@
|
|||
#include "nix/util/serialise.hh"
|
||||
#include "nix/util/compression.hh"
|
||||
#include "nix/util/signals.hh"
|
||||
#include "nix/util/socket.hh"
|
||||
#include "nix/util/util.hh"
|
||||
|
||||
#include <cstring>
|
||||
|
|
@ -11,7 +12,6 @@
|
|||
|
||||
#ifdef _WIN32
|
||||
# include <fileapi.h>
|
||||
# include <winsock2.h>
|
||||
# include "nix/util/windows-error.hh"
|
||||
#else
|
||||
# include <poll.h>
|
||||
|
|
@ -184,20 +184,20 @@ bool FdSource::hasData()
|
|||
while (true) {
|
||||
fd_set fds;
|
||||
FD_ZERO(&fds);
|
||||
int fd_ = fromDescriptorReadOnly(fd);
|
||||
FD_SET(fd_, &fds);
|
||||
Socket sock = toSocket(fd);
|
||||
FD_SET(sock, &fds);
|
||||
|
||||
struct timeval timeout;
|
||||
timeout.tv_sec = 0;
|
||||
timeout.tv_usec = 0;
|
||||
|
||||
auto n = select(fd_ + 1, &fds, nullptr, nullptr, &timeout);
|
||||
auto n = select(sock + 1, &fds, nullptr, nullptr, &timeout);
|
||||
if (n < 0) {
|
||||
if (errno == EINTR)
|
||||
continue;
|
||||
throw SysError("polling file descriptor");
|
||||
}
|
||||
return FD_ISSET(fd, &fds);
|
||||
return FD_ISSET(sock, &fds);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -437,22 +437,23 @@ static void forwardStdioConnection(RemoteStore & store)
|
|||
int from = conn->from.fd;
|
||||
int to = conn->to.fd;
|
||||
|
||||
auto nfds = std::max(from, STDIN_FILENO) + 1;
|
||||
Socket fromSock = toSocket(from), stdinSock = toSocket(getStandardInput());
|
||||
auto nfds = std::max(fromSock, stdinSock) + 1;
|
||||
while (true) {
|
||||
fd_set fds;
|
||||
FD_ZERO(&fds);
|
||||
FD_SET(from, &fds);
|
||||
FD_SET(STDIN_FILENO, &fds);
|
||||
FD_SET(fromSock, &fds);
|
||||
FD_SET(stdinSock, &fds);
|
||||
if (select(nfds, &fds, nullptr, nullptr, nullptr) == -1)
|
||||
throw SysError("waiting for data from client or server");
|
||||
if (FD_ISSET(from, &fds)) {
|
||||
if (FD_ISSET(fromSock, &fds)) {
|
||||
auto res = splice(from, nullptr, STDOUT_FILENO, nullptr, SSIZE_MAX, SPLICE_F_MOVE);
|
||||
if (res == -1)
|
||||
throw SysError("splicing data from daemon socket to stdout");
|
||||
else if (res == 0)
|
||||
throw EndOfFile("unexpected EOF from daemon socket");
|
||||
}
|
||||
if (FD_ISSET(STDIN_FILENO, &fds)) {
|
||||
if (FD_ISSET(stdinSock, &fds)) {
|
||||
auto res = splice(STDIN_FILENO, nullptr, to, nullptr, SSIZE_MAX, SPLICE_F_MOVE);
|
||||
if (res == -1)
|
||||
throw SysError("splicing data from stdin to daemon socket");
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue