nix: Update patches for 2.0

* Drop stat patch as was accepted upstream.
* NIX_REMOTE scheme is now URI based tcp://host:port
This commit is contained in:
Tyson Whitehead
2018-06-25 15:45:44 -04:00
parent fde6c31445
commit 01a6ed3f22
4 changed files with 110 additions and 110 deletions

View File

@@ -1,12 +1,12 @@
diff --git a/scripts/nix-build.in b/scripts/nix-build.in diff --git a/src/nix-build/nix-build.cc b/src/nix-build/nix-build.cc
index bb61e1c..d58d687 100755 index 99f77345..4f71fca1 100755
--- a/scripts/nix-build.in --- a/src/nix-build/nix-build.cc
+++ b/scripts/nix-build.in +++ b/src/nix-build/nix-build.cc
@@ -276,6 +276,7 @@ foreach my $expr (@exprs) { @@ -372,6 +372,7 @@ void mainWrapped(int argc, char * * argv)
} env = newEnv;
# NixOS hack: prevent /etc/bashrc from sourcing /etc/profile. // NixOS hack: prevent /etc/bashrc from sourcing /etc/profile.
$ENV{'__ETC_PROFILE_SOURCED'} = 1; env["__ETC_PROFILE_SOURCED"] = "1";
+ $ENV{'SKIP_CC_CVMFS'} = 1; + env["SKIP_CC_CVMFS"] = "1";
} }
$ENV{'NIX_BUILD_TOP'} = $ENV{'TMPDIR'} = $ENV{'TEMPDIR'} = $ENV{'TMP'} = $ENV{'TEMP'} = $tmp;
$ENV{'NIX_STORE'} = $Nix::Config::storeDir; env["NIX_BUILD_TOP"] = env["TMPDIR"] = env["TEMPDIR"] = env["TMP"] = env["TEMP"] = tmp;

View File

@@ -1,52 +1,47 @@
diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc
index 262e465..1bee9a6 100644 index 8f0b6555..b874e760 100644
--- a/src/libstore/remote-store.cc --- a/src/libstore/remote-store.cc
+++ b/src/libstore/remote-store.cc +++ b/src/libstore/remote-store.cc
@@ -16,6 +16,7 @@ @@ -15,6 +15,7 @@
#include <errno.h>
#include <iostream> #include <fcntl.h>
#include <unistd.h> #include <unistd.h>
+#include <netdb.h> +#include <netdb.h>
#include <cstring> #include <cstring>
namespace nix { @@ -133,6 +134,76 @@ ref<RemoteStore::Connection> UDSRemoteStore::openConnection()
@@ -55,9 +56,9 @@ void RemoteStore::openConnection(bool reserveSpace)
if (remoteMode == "daemon")
/* Connect to a daemon that does the privileged work for
us. */
- connectToDaemon();
+ connectToDaemonUNIX();
else
- throw Error(format("invalid setting for NIX_REMOTE, %1%") % remoteMode);
+ connectToDaemonINET(remoteMode);
from.fd = fdSocket;
to.fd = fdSocket;
@@ -95,7 +96,7 @@ void RemoteStore::openConnection(bool reserveSpace)
} }
-void RemoteStore::connectToDaemon() +TCPRemoteStore::TCPRemoteStore(std::string tcp_path, const Params & params)
+void RemoteStore::connectToDaemonUNIX() + : Store(params)
{ + , LocalFSStore(params)
fdSocket = socket(PF_UNIX, SOCK_STREAM, 0); + , RemoteStore(params)
if (fdSocket == -1) + , path(tcp_path)
@@ -128,6 +129,53 @@ void RemoteStore::connectToDaemon()
}
+
+void RemoteStore::connectToDaemonINET(const string & remoteAddress)
+{ +{
+ size_t remoteColonOffset = remoteAddress.find(':'); +}
+ if (remoteColonOffset == string::npos)
+ throw Error(format("invalid daemon address %1% (should be daemon or host:port)") % remoteAddress);
+ +
+ string remoteHost = remoteAddress.substr(0,remoteColonOffset); +
+ string remoteService = remoteAddress.substr(remoteColonOffset+1); +std::string TCPRemoteStore::getUri()
+{
+ return std::string("tcp://") + path;
+}
+
+
+ref<RemoteStore::Connection> TCPRemoteStore::openConnection()
+{
+ auto conn = make_ref<Connection>();
+
+ size_t remoteColonOffset = path.find(':');
+ if (remoteColonOffset == string::npos)
+ throw Error(format("invalid daemon address '%1%' (should be host:port)") % path);
+
+ string remoteHost = path.substr(0,remoteColonOffset);
+ string remoteService = path.substr(remoteColonOffset+1);
+ +
+ addrinfo addrHints; + addrinfo addrHints;
+ addrinfo* addrResults; + addrinfo* addrResults_raw;
+ +
+ memset(&addrHints,0,sizeof(addrHints)); + memset(&addrHints,0,sizeof(addrHints));
+ addrHints.ai_flags = AI_ADDRCONFIG | AI_V4MAPPED; + addrHints.ai_flags = AI_ADDRCONFIG | AI_V4MAPPED;
@@ -54,48 +49,91 @@ index 262e465..1bee9a6 100644
+ addrHints.ai_socktype = SOCK_STREAM; + addrHints.ai_socktype = SOCK_STREAM;
+ addrHints.ai_protocol = 0; + addrHints.ai_protocol = 0;
+ +
+ int result = getaddrinfo(remoteHost.c_str(), remoteService.c_str(), &addrHints, &addrResults); + int result = getaddrinfo(remoteHost.c_str(), remoteService.c_str(), &addrHints, &addrResults_raw);
+ if (result != 0) + if (result != 0)
+ throw Error(format("unable to lookup daemon address %1%") % remoteAddress); + throw Error(format("unable to lookup daemon address '%1%'") % path);
+ std::unique_ptr<addrinfo,void (&)(addrinfo *)> addrResults_gc(addrResults,freeaddrinfo); + std::unique_ptr<addrinfo,void (&)(addrinfo *)> addrResults(addrResults_raw,freeaddrinfo);
+ +
+ int remoteSocket;
+ addrinfo* addrIter; + addrinfo* addrIter;
+ for (addrIter = addrResults; addrIter; addrIter = addrIter->ai_next) { + for (addrIter = addrResults.get(); addrIter; addrIter = addrIter->ai_next) {
+ remoteSocket = socket(addrIter->ai_family, addrIter->ai_socktype, addrIter->ai_protocol); + AutoCloseFD remoteSocket = socket(addrIter->ai_family, addrIter->ai_socktype
+ if (remoteSocket == -1) + #ifdef SOCK_CLOEXEC
+ | SOCK_CLOEXEC
+ #endif
+ , addrIter->ai_protocol);
+ if (!remoteSocket)
+ continue; + continue;
+ +
+ int result = connect(remoteSocket, addrIter->ai_addr, addrIter->ai_addrlen); + if (::connect(remoteSocket.get(), addrIter->ai_addr, addrIter->ai_addrlen) == -1)
+ if (result == -1) {
+ close(remoteSocket);
+ continue; + continue;
+ }
+ +
+ fdSocket = remoteSocket; + conn->fd = std::move(remoteSocket);
+ break; + break;
+ } + }
+ if (addrIter == 0) + if (addrIter == 0)
+ throw Error(format("unable to connect to daemon at %1%") % remoteAddress); + throw Error(format("unable to connect to daemon at '%1%'") % path);
+ +
+ fdSocket = remoteSocket; + conn->from.fd = conn->fd.get();
+ conn->to.fd = conn->fd.get();
+
+ conn->startTime = std::chrono::steady_clock::now();
+
+ initConnection(*conn);
+
+ return conn;
+} +}
+ +
+ +
RemoteStore::~RemoteStore() void RemoteStore::initConnection(Connection & conn)
{ {
try { /* Send the magic greeting, check for the reply. */
@@ -734,14 +805,18 @@ void RemoteStore::Connection::processStderr(Sink * sink, Source * source)
}
}
-static std::string uriScheme = "unix://";
+static std::string uriSchemeUnix = "unix://";
+static std::string uriSchemeTCP = "tcp://";
static RegisterStoreImplementation regStore([](
const std::string & uri, const Store::Params & params)
-> std::shared_ptr<Store>
{
- if (std::string(uri, 0, uriScheme.size()) != uriScheme) return 0;
- return std::make_shared<UDSRemoteStore>(std::string(uri, uriScheme.size()), params);
+ if (std::string(uri, 0, uriSchemeUnix.size()) == uriSchemeUnix)
+ return std::make_shared<UDSRemoteStore>(std::string(uri, uriSchemeUnix.size()), params);
+ if (std::string(uri, 0, uriSchemeTCP.size()) == uriSchemeTCP)
+ return std::make_shared<TCPRemoteStore>(std::string(uri, uriSchemeTCP.size()), params);
+ return 0;
});
}
diff --git a/src/libstore/remote-store.hh b/src/libstore/remote-store.hh diff --git a/src/libstore/remote-store.hh b/src/libstore/remote-store.hh
index b0787c0..6fd404f 100644 index 7f36e206..544b76eb 100644
--- a/src/libstore/remote-store.hh --- a/src/libstore/remote-store.hh
+++ b/src/libstore/remote-store.hh +++ b/src/libstore/remote-store.hh
@@ -101,7 +101,8 @@ private: @@ -149,5 +149,23 @@ private:
std::experimental::optional<std::string> path;
void processStderr(Sink * sink = 0, Source * source = 0);
- void connectToDaemon();
+ void connectToDaemonUNIX();
+ void connectToDaemonINET(const string & remoteAddress);
void setOptions();
}; };
+class TCPRemoteStore : public LocalFSStore, public RemoteStore
+{
+public:
+
+ TCPRemoteStore(std::string path, const Params & params);
+
+ std::string getUri() override;
+
+private:
+
+ struct Connection : RemoteStore::Connection
+ {
+ AutoCloseFD fd;
+ };
+
+ ref<RemoteStore::Connection> openConnection() override;
+ std::string path;
+};
}

View File

@@ -7,9 +7,4 @@
self: super: pkgs: with pkgs; { self: super: pkgs: with pkgs; {
# https://github.com/NixOS/nix/pull/1645
nixStable = super.nixStable.overrideAttrs
( attrs: { patches = attrs.patches or [] ++ [ ./nix/stat.patch ]; } );
nix = super.nix.overrideAttrs
( attrs: { patches = attrs.patches or [] ++ [ ./nix/stat.patch ]; } );
} }

View File

@@ -1,33 +0,0 @@
diff --git a/src/libutil/util.cc b/src/libutil/util.cc
index 0b11330..4c1dff2 100644
--- a/src/libutil/util.cc
+++ b/src/libutil/util.cc
@@ -198,17 +198,17 @@ bool pathExists(const Path & path)
Path readLink(const Path & path)
{
checkInterrupt();
- struct stat st = lstat(path);
- if (!S_ISLNK(st.st_mode))
- throw Error(format("%1% is not a symlink") % path);
- char buf[st.st_size];
- ssize_t rlsize = readlink(path.c_str(), buf, st.st_size);
- if (rlsize == -1)
- throw SysError(format("reading symbolic link %1%") % path);
- else if (rlsize > st.st_size)
- throw Error(format("symbolic link %1% size overflow %2% > %3%")
- % path % rlsize % st.st_size);
- return string(buf, st.st_size);
+ for (ssize_t bufSize = PATH_MAX/4; true; bufSize += bufSize/2) {
+ char buf[bufSize];
+ ssize_t rlSize = readlink(path.c_str(), buf, bufSize);
+ if (rlSize == -1)
+ if (errno == EINVAL)
+ throw Error(format("'%1%' is not a symlink") % path);
+ else
+ throw SysError(format("reading symbolic link '%1%'") % path);
+ else if (rlSize < bufSize)
+ return string(buf, rlSize);
+ }
}