From 6d4df4766657e1f65f817c32bcace3e1ff676d3a Mon Sep 17 00:00:00 2001 From: "Curtis.Bezault" Date: Fri, 17 May 2019 09:21:35 -0700 Subject: [PATCH 1/8] Use Linux copy logic for macOS --- toolsrc/src/vcpkg/base/files.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/toolsrc/src/vcpkg/base/files.cpp b/toolsrc/src/vcpkg/base/files.cpp index 16439410037b13..8bd6b7970e7e0c 100644 --- a/toolsrc/src/vcpkg/base/files.cpp +++ b/toolsrc/src/vcpkg/base/files.cpp @@ -166,7 +166,7 @@ namespace vcpkg::Files std::error_code& ec) override { this->rename(oldpath, newpath, ec); -#if defined(__linux__) +#if defined(__linux__) || defined(__APPLE__) if (ec) { auto dst = newpath; From cc3473ad86d720d16821f0e2f068d84e7ab0c047 Mon Sep 17 00:00:00 2001 From: "Curtis.Bezault" Date: Fri, 17 May 2019 09:26:58 -0700 Subject: [PATCH 2/8] Use linux headers for macOS --- toolsrc/src/vcpkg/base/files.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/toolsrc/src/vcpkg/base/files.cpp b/toolsrc/src/vcpkg/base/files.cpp index 8bd6b7970e7e0c..9aca822799a437 100644 --- a/toolsrc/src/vcpkg/base/files.cpp +++ b/toolsrc/src/vcpkg/base/files.cpp @@ -7,7 +7,7 @@ #include #include -#if defined(__linux__) +#if defined(__linux__) || defined(__APPLE__) #include #include #include From 8c7326456c3814ca008a04d37e68169eee5f621b Mon Sep 17 00:00:00 2001 From: "Curtis.Bezault" Date: Fri, 17 May 2019 09:33:00 -0700 Subject: [PATCH 3/8] Use correct headers on macOS --- toolsrc/src/vcpkg/base/files.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/toolsrc/src/vcpkg/base/files.cpp b/toolsrc/src/vcpkg/base/files.cpp index 9aca822799a437..be8bd84ec58798 100644 --- a/toolsrc/src/vcpkg/base/files.cpp +++ b/toolsrc/src/vcpkg/base/files.cpp @@ -9,11 +9,17 @@ #if defined(__linux__) || defined(__APPLE__) #include -#include #include #include #include #endif +#if defined(__linux__) +#include +#endif +#if defined(__APPLE__) +#include +#include +#endif namespace vcpkg::Files { From cf3c2716f68651140b87982d245ff6186736a807 Mon Sep 17 00:00:00 2001 From: "Curtis.Bezault" Date: Fri, 17 May 2019 09:42:36 -0700 Subject: [PATCH 4/8] Use macOS sendfile API correctly --- toolsrc/src/vcpkg/base/files.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/toolsrc/src/vcpkg/base/files.cpp b/toolsrc/src/vcpkg/base/files.cpp index be8bd84ec58798..6e126b3bd873ee 100644 --- a/toolsrc/src/vcpkg/base/files.cpp +++ b/toolsrc/src/vcpkg/base/files.cpp @@ -15,8 +15,7 @@ #endif #if defined(__linux__) #include -#endif -#if defined(__APPLE__) +#elif defined(__APPLE__) #include #include #endif @@ -189,9 +188,13 @@ namespace vcpkg::Files } off_t bytes = 0; +#if defined(__linux__) struct stat info = {0}; fstat(i_fd, &info); auto written_bytes = sendfile(o_fd, i_fd, &bytes, info.st_size); +#elif defined(__APPLE__) + auto written_bytes = sendfile(i_fd, o_fd, bytes, 0, NULL, 0); +#endif close(i_fd); close(o_fd); if (written_bytes == -1) return; From 312fb43fbf4bb6477514fb246e14207d791f1db5 Mon Sep 17 00:00:00 2001 From: "Curtis.Bezault" Date: Fri, 17 May 2019 10:30:17 -0700 Subject: [PATCH 5/8] Use macOS API not FreeBSD --- toolsrc/src/vcpkg/base/files.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/toolsrc/src/vcpkg/base/files.cpp b/toolsrc/src/vcpkg/base/files.cpp index 6e126b3bd873ee..ac800f7b885a9f 100644 --- a/toolsrc/src/vcpkg/base/files.cpp +++ b/toolsrc/src/vcpkg/base/files.cpp @@ -193,7 +193,8 @@ namespace vcpkg::Files fstat(i_fd, &info); auto written_bytes = sendfile(o_fd, i_fd, &bytes, info.st_size); #elif defined(__APPLE__) - auto written_bytes = sendfile(i_fd, o_fd, bytes, 0, NULL, 0); + off_t offset = 0; + auto written_bytes = sendfile(i_fd, o_fd, offset, &bytes, NULL, 0); #endif close(i_fd); close(o_fd); From 0fc0634bceeb0212b58763ce7b2c2c14056bea80 Mon Sep 17 00:00:00 2001 From: "Curtis.Bezault" Date: Fri, 17 May 2019 12:56:45 -0700 Subject: [PATCH 6/8] print error message --- toolsrc/src/vcpkg/base/files.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/toolsrc/src/vcpkg/base/files.cpp b/toolsrc/src/vcpkg/base/files.cpp index ac800f7b885a9f..7aec90b8211d8b 100644 --- a/toolsrc/src/vcpkg/base/files.cpp +++ b/toolsrc/src/vcpkg/base/files.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #endif #if defined(__linux__) #include @@ -198,7 +199,11 @@ namespace vcpkg::Files #endif close(i_fd); close(o_fd); - if (written_bytes == -1) return; + if (written_bytes == -1) + { + System::print2(strerror(errno)); + return; + } this->rename(dst, newpath, ec); if (ec) return; From 6f08d1942973d111e02c4c324c104afa5538c5df Mon Sep 17 00:00:00 2001 From: "Curtis.Bezault" Date: Fri, 17 May 2019 13:51:42 -0700 Subject: [PATCH 7/8] Use fcopyfile instead of sendfile on macOS, as of 10.5 a restriction was added to sendfile that the output descriptor need actually be a stream socket --- toolsrc/src/vcpkg/base/files.cpp | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/toolsrc/src/vcpkg/base/files.cpp b/toolsrc/src/vcpkg/base/files.cpp index 7aec90b8211d8b..42342418bf5abf 100644 --- a/toolsrc/src/vcpkg/base/files.cpp +++ b/toolsrc/src/vcpkg/base/files.cpp @@ -17,8 +17,7 @@ #if defined(__linux__) #include #elif defined(__APPLE__) -#include -#include +#include #endif namespace vcpkg::Files @@ -188,23 +187,23 @@ namespace vcpkg::Files return; } - off_t bytes = 0; #if defined(__linux__) + off_t bytes = 0; struct stat info = {0}; fstat(i_fd, &info); auto written_bytes = sendfile(o_fd, i_fd, &bytes, info.st_size); #elif defined(__APPLE__) - off_t offset = 0; - auto written_bytes = sendfile(i_fd, o_fd, offset, &bytes, NULL, 0); + auto written_bytes = fcopyfile(i_fd, o_fd, 0, COPYFILE_ALL); #endif - close(i_fd); - close(o_fd); if (written_bytes == -1) { - System::print2(strerror(errno)); + ec.assign(errno, std::generic_category()); return; } + close(i_fd); + close(o_fd); + this->rename(dst, newpath, ec); if (ec) return; this->remove(oldpath, ec); From 0590f713a84b4017e01aaf188510103e9cf6c3b6 Mon Sep 17 00:00:00 2001 From: "Curtis.Bezault" Date: Fri, 17 May 2019 14:06:06 -0700 Subject: [PATCH 8/8] close file descriptors if sendfile of fcopyfile fails --- toolsrc/src/vcpkg/base/files.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/toolsrc/src/vcpkg/base/files.cpp b/toolsrc/src/vcpkg/base/files.cpp index 42342418bf5abf..43149131439ae1 100644 --- a/toolsrc/src/vcpkg/base/files.cpp +++ b/toolsrc/src/vcpkg/base/files.cpp @@ -198,6 +198,9 @@ namespace vcpkg::Files if (written_bytes == -1) { ec.assign(errno, std::generic_category()); + close(i_fd); + close(o_fd); + return; }