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:
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
+};
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
@@ -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 ]; } );
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user