This is an automated email from the ASF dual-hosted git repository.

szaszm pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi-minifi-cpp.git

commit 36b4c092b29c1d7ab60c1c55535a1dc6e9cbab7f
Author: Gabor Gyimesi <[email protected]>
AuthorDate: Tue May 26 14:51:35 2026 +0200

    MINIFICPP-2819 Fix LibSSH2 link failure on Windows
    
    This change fixes the compilation issues of SFTP extension and tests, but 
SFTP test server is still not implemented on Windows so tests are still 
disabled on Windows for the time being, a new ticket is opened for fixing the 
tests: https://issues.apache.org/jira/browse/MINIFICPP-2820
    
    Closes #2180
    
    Signed-off-by: Marton Szasz <[email protected]>
---
 .github/workflows/ci.yml                   |   4 +-
 cmake/FetchLibSSH2.cmake                   |  10 ++-
 extensions/sftp/tests/CMakeLists.txt       |   5 ++
 extensions/sftp/tests/ListSFTPTests.cpp    |   2 +-
 extensions/sftp/tests/PutSFTPTests.cpp     | 112 +++++++++++++++--------------
 thirdparty/libssh2/fix-windows-ioctl.patch |  21 ++++++
 6 files changed, 95 insertions(+), 59 deletions(-)

diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 0ee7632c8..30fc13e2f 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -49,7 +49,7 @@ jobs:
         -DENABLE_PROMETHEUS=ON
         -DENABLE_PYTHON_SCRIPTING=ON
         -DENABLE_ROCKSDB=ON
-        -DENABLE_SFTP=OFF
+        -DENABLE_SFTP=ON
         -DENABLE_SPLUNK=ON
         -DENABLE_SQL=ON
         -DENABLE_TEST_PROCESSORS=OFF
@@ -155,7 +155,7 @@ jobs:
         -DENABLE_PROMETHEUS=ON
         -DENABLE_PYTHON_SCRIPTING=ON
         -DENABLE_ROCKSDB=ON
-        -DENABLE_SFTP=OFF
+        -DENABLE_SFTP=ON
         -DENABLE_SMB=ON
         -DENABLE_SPLUNK=ON
         -DENABLE_SQL=ON
diff --git a/cmake/FetchLibSSH2.cmake b/cmake/FetchLibSSH2.cmake
index d4d99dec8..016b1dcd2 100644
--- a/cmake/FetchLibSSH2.cmake
+++ b/cmake/FetchLibSSH2.cmake
@@ -22,7 +22,15 @@ find_package(ZLIB REQUIRED)
 
 include(FetchContent)
 
-set(PC "${Patch_EXECUTABLE}" -p1 -i 
"${CMAKE_SOURCE_DIR}/thirdparty/libssh2/libssh2-CMAKE_MODULE_PATH.patch")
+if (WIN32)
+    set(PATCH_FILE_1 
"${CMAKE_SOURCE_DIR}/thirdparty/libssh2/libssh2-CMAKE_MODULE_PATH.patch")
+    set(PATCH_FILE_2 
"${CMAKE_SOURCE_DIR}/thirdparty/libssh2/fix-windows-ioctl.patch")
+    set(PC ${Bash_EXECUTABLE}  -c "set -x &&\
+        (\\\"${Patch_EXECUTABLE}\\\" -p1 -R -s -f --dry-run -i 
\\\"${PATCH_FILE_1}\\\" || \\\"${Patch_EXECUTABLE}\\\" -p1 -N -i 
\\\"${PATCH_FILE_1}\\\") &&\
+        (\\\"${Patch_EXECUTABLE}\\\" -p1 -R -s -f --dry-run -i 
\\\"${PATCH_FILE_2}\\\" || \\\"${Patch_EXECUTABLE}\\\" -p1 -N -i 
\\\"${PATCH_FILE_2}\\\")")
+else()
+    set(PC "${Patch_EXECUTABLE}" -p1 -i 
"${CMAKE_SOURCE_DIR}/thirdparty/libssh2/libssh2-CMAKE_MODULE_PATH.patch")
+endif()
 
 FetchContent_Declare(
         libssh2
diff --git a/extensions/sftp/tests/CMakeLists.txt 
b/extensions/sftp/tests/CMakeLists.txt
index a285ae514..fa06a8b04 100644
--- a/extensions/sftp/tests/CMakeLists.txt
+++ b/extensions/sftp/tests/CMakeLists.txt
@@ -17,6 +17,11 @@
 # under the License.
 #
 
+# SFTPTestServer is not implemented on Windows at the moment
+if (WIN32)
+    return()
+endif()
+
 # Java is required for SFTPTestServer, we will disable tests if we can't find 
it
 find_package(Java)
 find_package(Maven)
diff --git a/extensions/sftp/tests/ListSFTPTests.cpp 
b/extensions/sftp/tests/ListSFTPTests.cpp
index 9ac1da9fd..3fc5506ec 100644
--- a/extensions/sftp/tests/ListSFTPTests.cpp
+++ b/extensions/sftp/tests/ListSFTPTests.cpp
@@ -215,7 +215,6 @@ TEST_CASE_METHOD(ListSFTPTestsFixture, "ListSFTP list 
non-readable dir", "[ListS
   REQUIRE(LogTestController::getInstance().contains("There are no files to 
list. Yielding."));
   std::filesystem::permissions(working_directory / "vfs" / "nifi_test", 
static_cast<std::filesystem::perms>(0755));
 }
-#endif
 
 TEST_CASE_METHOD(ListSFTPTestsFixture, "ListSFTP list one file writes 
attributes", "[ListSFTP][basic]") {
   createFileWithModificationTimeDiff("nifi_test/tstFile.ext", "Test content 
1");
@@ -243,6 +242,7 @@ TEST_CASE_METHOD(ListSFTPTestsFixture, "ListSFTP list one 
file writes attributes
   REQUIRE(LogTestController::getInstance().contains("key:filename 
value:tstFile.ext"));
   REQUIRE(LogTestController::getInstance().contains("key:path 
value:nifi_test"));
 }
+#endif
 
 TEST_CASE_METHOD(ListSFTPTestsFixture, "ListSFTP list two files", 
"[ListSFTP][basic]") {
   createFileWithModificationTimeDiff("nifi_test/file1.ext", "Test content 1");
diff --git a/extensions/sftp/tests/PutSFTPTests.cpp 
b/extensions/sftp/tests/PutSFTPTests.cpp
index db33284a2..b6c925a03 100644
--- a/extensions/sftp/tests/PutSFTPTests.cpp
+++ b/extensions/sftp/tests/PutSFTPTests.cpp
@@ -166,6 +166,7 @@ class PutSFTPTestsFixture {
     REQUIRE(expected_permissions == permissions);
   }
 
+#ifndef WIN32
   void testOwner(const std::string& relative_path, uint64_t expected_uid) 
const {
     const auto result_file = dst_dir / "vfs" / relative_path;
 
@@ -183,6 +184,7 @@ class PutSFTPTestsFixture {
     REQUIRE(true == utils::file::get_uid_gid(result_file, uid, gid));
     REQUIRE(expected_gid == gid);
   }
+#endif
 
  protected:
   TestController testController;
@@ -201,7 +203,7 @@ std::size_t directoryContentCount(const 
std::filesystem::path& dir) {
 }  // namespace
 
 TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP put one file", 
"[PutSFTP][basic]") {
-  createFile(src_dir, "tstFile.ext", "tempFile");
+  createFile(src_dir.string(), "tstFile.ext", "tempFile");
 
   testController.runSession(plan, true);
 
@@ -209,8 +211,8 @@ TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP put one 
file", "[PutSFTP][basic]"
 }
 
 TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP put two files", 
"[PutSFTP][basic]") {
-  createFile(src_dir, "tstFile1.ext", "content 1");
-  createFile(src_dir, "tstFile2.ext", "content 2");
+  createFile(src_dir.string(), "tstFile1.ext", "content 1");
+  createFile(src_dir.string(), "tstFile2.ext", "content 2");
 
   testController.runSession(plan, true);
 
@@ -220,7 +222,7 @@ TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP put two 
files", "[PutSFTP][basic]
 
 TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP bad password", 
"[PutSFTP][authentication]") {
   plan->setProperty(put, "Password", "badpassword");
-  createFile(src_dir, "tstFile.ext", "tempFile");
+  createFile(src_dir.string(), "tstFile.ext", "tempFile");
 
   try {
     testController.runSession(plan, true);
@@ -237,7 +239,7 @@ TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP public key 
authentication success
   plan->setProperty(put, "Private Key Path", (get_sftp_test_dir() / 
"resources" / "id_rsa").string());
   plan->setProperty(put, "Private Key Passphrase", "privatekeypassword");
 
-  createFile(src_dir, "tstFile.ext", "tempFile");
+  createFile(src_dir.string(), "tstFile.ext", "tempFile");
 
   testController.runSession(plan, true);
 
@@ -250,7 +252,7 @@ TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP public key 
authentication bad pas
   plan->setProperty(put, "Private Key Path", (get_sftp_test_dir() / 
"resources" / "id_rsa").string());
   plan->setProperty(put, "Private Key Passphrase", "badpassword");
 
-  createFile(src_dir, "tstFile.ext", "tempFile");
+  createFile(src_dir.string(), "tstFile.ext", "tempFile");
 
   try {
     testController.runSession(plan, true);
@@ -266,7 +268,7 @@ TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP public key 
authentication bad pas
   plan->setProperty(put, "Private Key Path", (get_sftp_test_dir() / 
"resources" / "id_rsa").string());
   plan->setProperty(put, "Private Key Passphrase", "badpassword");
 
-  createFile(src_dir, "tstFile.ext", "tempFile");
+  createFile(src_dir.string(), "tstFile.ext", "tempFile");
 
   testController.runSession(plan, true);
 
@@ -279,7 +281,7 @@ TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP host key 
checking success", "[Put
   plan->setProperty(put, "Host Key File", (get_sftp_test_dir() / "resources" / 
"known_hosts").string());
   plan->setProperty(put, "Strict Host Key Checking", "true");
 
-  createFile(src_dir, "tstFile.ext", "tempFile");
+  createFile(src_dir.string(), "tstFile.ext", "tempFile");
 
   testController.runSession(plan, true);
 
@@ -293,7 +295,7 @@ TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP host key 
checking missing strict"
   plan->setProperty(put, "Host Key File", (get_sftp_test_dir() / "resources" / 
"known_hosts").string());
   plan->setProperty(put, "Strict Host Key Checking", "true");
 
-  createFile(src_dir, "tstFile.ext", "tempFile");
+  createFile(src_dir.string(), "tstFile.ext", "tempFile");
 
   try {
     testController.runSession(plan, true);
@@ -311,7 +313,7 @@ TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP host key 
checking missing non-str
   plan->setProperty(put, "Host Key File", (get_sftp_test_dir() / "resources" / 
"known_hosts").string());
   plan->setProperty(put, "Strict Host Key Checking", "false");
 
-  createFile(src_dir, "tstFile.ext", "tempFile");
+  createFile(src_dir.string(), "tstFile.ext", "tempFile");
 
   testController.runSession(plan, true);
 
@@ -323,7 +325,7 @@ TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP host key 
checking mismatch strict
   plan->setProperty(put, "Host Key File", (get_sftp_test_dir() / "resources" / 
"known_hosts_mismatch").string());
   plan->setProperty(put, "Strict Host Key Checking", "true");
 
-  createFile(src_dir, "tstFile.ext", "tempFile");
+  createFile(src_dir.string(), "tstFile.ext", "tempFile");
 
   try {
     testController.runSession(plan, true);
@@ -351,9 +353,9 @@ TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP host key 
checking mismatch strict
 TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP conflict resolution rename", 
"[PutSFTP][conflict-resolution]") {
   plan->setProperty(put, "Conflict Resolution", 
minifi::processors::PutSFTP::CONFLICT_RESOLUTION_RENAME);
 
-  createFile(src_dir, "tstFile1.ext", "content 1");
+  createFile(src_dir.string(), "tstFile1.ext", "content 1");
   REQUIRE(0 == utils::file::create_dir(dst_dir / "vfs" / "nifi_test"));
-  createFile(dst_dir / "vfs", "nifi_test/tstFile1.ext", "content 2");
+  createFile((dst_dir / "vfs").string(), "nifi_test/tstFile1.ext", "content 
2");
 
   testController.runSession(plan, true);
 
@@ -365,9 +367,9 @@ TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP conflict 
resolution rename", "[Pu
 TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP conflict resolution reject", 
"[PutSFTP][conflict-resolution]") {
   plan->setProperty(put, "Conflict Resolution", 
minifi::processors::PutSFTP::CONFLICT_RESOLUTION_REJECT);
 
-  createFile(src_dir, "tstFile1.ext", "content 1");
+  createFile(src_dir.string(), "tstFile1.ext", "content 1");
   REQUIRE(0 == utils::file::create_dir(dst_dir / "vfs" / "nifi_test"));
-  createFile(dst_dir / "vfs", "nifi_test/tstFile1.ext", "content 2");
+  createFile((dst_dir / "vfs").string(), "nifi_test/tstFile1.ext", "content 
2");
 
   testController.runSession(plan, true);
 
@@ -378,9 +380,9 @@ TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP conflict 
resolution reject", "[Pu
 TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP conflict resolution fail", 
"[PutSFTP][conflict-resolution]") {
   plan->setProperty(put, "Conflict Resolution", 
minifi::processors::PutSFTP::CONFLICT_RESOLUTION_FAIL);
 
-  createFile(src_dir, "tstFile1.ext", "content 1");
+  createFile(src_dir.string(), "tstFile1.ext", "content 1");
   REQUIRE(0 == utils::file::FileUtils::create_dir(dst_dir / "vfs" / 
"nifi_test"));
-  createFile(dst_dir / "vfs", "nifi_test/tstFile1.ext", "content 2");
+  createFile((dst_dir / "vfs").string(), "nifi_test/tstFile1.ext", "content 
2");
 
   testController.runSession(plan, true);
 
@@ -391,9 +393,9 @@ TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP conflict 
resolution fail", "[PutS
 TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP conflict resolution ignore", 
"[PutSFTP][conflict-resolution]") {
   plan->setProperty(put, "Conflict Resolution", 
minifi::processors::PutSFTP::CONFLICT_RESOLUTION_IGNORE);
 
-  createFile(src_dir, "tstFile1.ext", "content 1");
+  createFile(src_dir.string(), "tstFile1.ext", "content 1");
   REQUIRE(0 == utils::file::FileUtils::create_dir(dst_dir / "vfs" / 
"nifi_test"));
-  createFile(dst_dir / "vfs", "nifi_test/tstFile1.ext", "content 2");
+  createFile((dst_dir / "vfs").string(), "nifi_test/tstFile1.ext", "content 
2");
 
   testController.runSession(plan, true);
 
@@ -405,9 +407,9 @@ TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP conflict 
resolution ignore", "[Pu
 TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP conflict resolution replace", 
"[PutSFTP][conflict-resolution]") {
   plan->setProperty(put, "Conflict Resolution", 
minifi::processors::PutSFTP::CONFLICT_RESOLUTION_REPLACE);
 
-  createFile(src_dir, "tstFile1.ext", "content 1");
+  createFile(src_dir.string(), "tstFile1.ext", "content 1");
   REQUIRE(0 == utils::file::FileUtils::create_dir(dst_dir / "vfs" / 
"nifi_test"));
-  createFile(dst_dir / "vfs", "nifi_test/tstFile1.ext", "content 2");
+  createFile((dst_dir / "vfs").string(), "nifi_test/tstFile1.ext", "content 
2");
 
   testController.runSession(plan, true);
 
@@ -418,9 +420,9 @@ TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP conflict 
resolution replace", "[P
 TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP conflict resolution none", 
"[PutSFTP][conflict-resolution]") {
   plan->setProperty(put, "Conflict Resolution", 
minifi::processors::PutSFTP::CONFLICT_RESOLUTION_NONE);
 
-  createFile(src_dir, "tstFile1.ext", "content 1");
+  createFile(src_dir.string(), "tstFile1.ext", "content 1");
   REQUIRE(0 == utils::file::FileUtils::create_dir(dst_dir / "vfs" / 
"nifi_test"));
-  createFile(dst_dir / "vfs", "nifi_test/tstFile1.ext", "content 2");
+  createFile((dst_dir / "vfs").string(), "nifi_test/tstFile1.ext", "content 
2");
 
   testController.runSession(plan, true);
 
@@ -450,7 +452,7 @@ TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP conflict 
resolution with director
     should_predetect_failure = false;
   }
 
-  createFile(src_dir, "tstFile1.ext", "content 1");
+  createFile(src_dir.string(), "tstFile1.ext", "content 1");
   REQUIRE(0 == utils::file::FileUtils::create_dir(dst_dir / "vfs" / 
"nifi_test"));
   REQUIRE(0 == utils::file::FileUtils::create_dir(dst_dir / "vfs" / 
"nifi_test" / "tstFile1.ext"));
 
@@ -468,7 +470,7 @@ TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP conflict 
resolution with director
 TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP reject zero-byte false", 
"[PutSFTP]") {
   plan->setProperty(put, "Reject Zero-Byte Files", "false");
 
-  createFile(src_dir, "tstFile1.ext", "");
+  createFile(src_dir.string(), "tstFile1.ext", "");
 
   testController.runSession(plan, true);
 
@@ -479,7 +481,7 @@ TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP reject 
zero-byte false", "[PutSFT
 TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP reject zero-byte true", 
"[PutSFTP]") {
   plan->setProperty(put, "Reject Zero-Byte Files", "true");
 
-  createFile(src_dir, "tstFile1.ext", "");
+  createFile(src_dir.string(), "tstFile1.ext", "");
 
   testController.runSession(plan, true);
 
@@ -491,7 +493,7 @@ TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP reject 
zero-byte true", "[PutSFTP
 TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP set mtime", "[PutSFTP]") {
   plan->setProperty(put, "Last Modified Time", "2065-01-24T05:20:00Z");
 
-  createFile(src_dir, "tstFile1.ext", "content 1");
+  createFile(src_dir.string(), "tstFile1.ext", "content 1");
 
   testController.runSession(plan, true);
 
@@ -504,7 +506,7 @@ TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP set mtime", 
"[PutSFTP]") {
 TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP set permissions", "[PutSFTP]") {
   plan->setProperty(put, "Permissions", "0613");
 
-  createFile(src_dir, "tstFile1.ext", "content 1");
+  createFile(src_dir.string(), "tstFile1.ext", "content 1");
 
   testController.runSession(plan, true);
 
@@ -522,7 +524,7 @@ TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP set uid and 
gid", "[PutSFTP]") {
   plan->setProperty(put, "Remote Owner", "1234");
   plan->setProperty(put, "Remote Group", "4567");
 
-  createFile(src_dir, "tstFile1.ext", "content 1");
+  createFile(src_dir.string(), "tstFile1.ext", "content 1");
 
   testController.runSession(plan, true);
 
@@ -535,7 +537,7 @@ TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP set uid and 
gid", "[PutSFTP]") {
 TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP disable directory creation", 
"[PutSFTP]") {
   plan->setProperty(put, "Create Directory", "false");
 
-  createFile(src_dir, "tstFile1.ext", "content 1");
+  createFile(src_dir.string(), "tstFile1.ext", "content 1");
 
   testController.runSession(plan, true);
 
@@ -554,14 +556,14 @@ TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP test dot 
rename", "[PutSFTP]") {
     should_fail = false;
   }
 
-  createFile(src_dir, "tstFile1.ext", "content 1");
+  createFile(src_dir.string(), "tstFile1.ext", "content 1");
 
   /*
    * We create the would-be dot renamed file in the target, and because we 
don't overwrite temporary files,
    * if we really use a dot renamed temporary file, we should fail.
    */
   REQUIRE(0 == utils::file::FileUtils::create_dir(dst_dir / "vfs" / 
"nifi_test"));
-  createFile(dst_dir / "vfs", "nifi_test/.tstFile1.ext", "");
+  createFile((dst_dir / "vfs").string(), "nifi_test/.tstFile1.ext", "");
 
   testController.runSession(plan, true);
 
@@ -586,14 +588,14 @@ TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP test 
temporary filename", "[PutSF
     should_fail = false;
   }
 
-  createFile(src_dir, "tstFile1.ext", "content 1");
+  createFile(src_dir.string(), "tstFile1.ext", "content 1");
 
   /*
    * We create the would-be temporary file in the target, and because we don't 
overwrite temporary files,
    * if we really use the temporary file, we should fail.
    */
   REQUIRE(0 == utils::file::FileUtils::create_dir(dst_dir / "vfs" / 
"nifi_test"));
-  createFile(dst_dir / "vfs", "nifi_test/tstFile1.ext.temp", "");
+  createFile((dst_dir / "vfs").string(), "nifi_test/tstFile1.ext.temp", "");
 
   testController.runSession(plan, true);
 
@@ -609,9 +611,9 @@ TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP test 
temporary filename", "[PutSF
 TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP test temporary file cleanup", 
"[PutSFTP]") {
   plan->setProperty(put, "Conflict Resolution", 
minifi::processors::PutSFTP::CONFLICT_RESOLUTION_NONE);
 
-  createFile(src_dir, "tstFile1.ext", "content 1");
+  createFile(src_dir.string(), "tstFile1.ext", "content 1");
   REQUIRE(0 == utils::file::FileUtils::create_dir(dst_dir / "vfs" / 
"nifi_test"));
-  createFile(dst_dir / "vfs", "nifi_test/tstFile1.ext", "content 2");
+  createFile((dst_dir / "vfs").string(), "nifi_test/tstFile1.ext", "content 
2");
 
   testController.runSession(plan, true);
 
@@ -631,7 +633,7 @@ TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP test disable 
directory listing",
     should_list = false;
   }
 
-  createFile(src_dir, "tstFile1.ext", "content 1");
+  createFile(src_dir.string(), "tstFile1.ext", "content 1");
 
   testController.runSession(plan, true);
 
@@ -642,8 +644,8 @@ TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP test disable 
directory listing",
 }
 
 TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP connection caching reuse", 
"[PutSFTP][connection-caching]") {
-  createFile(src_dir, "tstFile1.ext", "content 1");
-  createFile(src_dir, "tstFile2.ext", "content 2");
+  createFile(src_dir.string(), "tstFile1.ext", "content 1");
+  createFile(src_dir.string(), "tstFile2.ext", "content 2");
 
   testController.runSession(plan, true);
 
@@ -655,7 +657,7 @@ TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP connection 
caching reuse", "[PutS
 }
 
 TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP connection caching does not 
reuse bad connection", "[PutSFTP][connection-caching]") {
-  createFile(src_dir, "tstFile1.ext", "content 1");
+  createFile(src_dir.string(), "tstFile1.ext", "content 1");
 
   /* Simulate connection failure */
   const auto port = sftp_server->getPort();
@@ -724,10 +726,10 @@ TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP connection 
caching reaches limit"
   std::vector<std::unique_ptr<SFTPTestServer>> sftp_servers;
 
   for (size_t i = 0; i < 10; i++) {
-    std::string destination_dir = testController.createTempDirectory();
+    std::string destination_dir = 
testController.createTempDirectory().string();
     
sftp_servers.emplace_back(std::make_unique<SFTPTestServer>(destination_dir));
     REQUIRE(true == sftp_servers.back()->start());
-    createFile(src_dir, "tstFile" + std::to_string(i) + ".ext", 
std::to_string(sftp_servers.back()->getPort()));
+    createFile(src_dir.string(), "tstFile" + std::to_string(i) + ".ext", 
std::to_string(sftp_servers.back()->getPort()));
 
     testController.runSession(plan, true);
     plan->reset();
@@ -747,8 +749,8 @@ TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP connection 
caching reaches limit"
 TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP batching two files in one 
batch", "[PutSFTP][batching]") {
   plan->setProperty(put, "Batch Size", "2");
 
-  createFile(src_dir, "tstFile1.ext", "content 1");
-  createFile(src_dir, "tstFile2.ext", "content 2");
+  createFile(src_dir.string(), "tstFile1.ext", "content 1");
+  createFile(src_dir.string(), "tstFile2.ext", "content 2");
 
   testController.runSession(plan, true);
 
@@ -758,15 +760,15 @@ TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP batching 
two files in one batch",
 TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP batching two files in two 
batches", "[PutSFTP][batching]") {
   plan->setProperty(put, "Batch Size", "1");
 
-  createFile(src_dir, "tstFile1.ext", "content 1");
-  createFile(src_dir, "tstFile2.ext", "content 2");
+  createFile(src_dir.string(), "tstFile1.ext", "content 1");
+  createFile(src_dir.string(), "tstFile2.ext", "content 2");
 
   testController.runSession(plan, true);
   REQUIRE(1U == directoryContentCount(dst_dir / "vfs" / "nifi_test"));
   plan->reset();
 
-  createFile(src_dir, "tstFile1.ext", "content 1");
-  createFile(src_dir, "tstFile2.ext", "content 2");
+  createFile(src_dir.string(), "tstFile1.ext", "content 1");
+  createFile(src_dir.string(), "tstFile2.ext", "content 2");
 
   testController.runSession(plan, true);
   REQUIRE(2U == directoryContentCount(dst_dir / "vfs" / "nifi_test"));
@@ -777,13 +779,13 @@ TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP batching 
does not fail even if on
   plan->setProperty(put, "Batch Size", "3");
   plan->setProperty(put, "Conflict Resolution", 
minifi::processors::PutSFTP::CONFLICT_RESOLUTION_FAIL);
 
-  createFile(src_dir, "tstFile1.ext", "content 1");
-  createFile(src_dir, "tstFile2.ext", "content 2");
-  createFile(src_dir, "tstFile3.ext", "content 3");
+  createFile(src_dir.string(), "tstFile1.ext", "content 1");
+  createFile(src_dir.string(), "tstFile2.ext", "content 2");
+  createFile(src_dir.string(), "tstFile3.ext", "content 3");
 
   REQUIRE(0 == utils::file::FileUtils::create_dir(dst_dir / "vfs/nifi_test"));
-  createFile(dst_dir / "vfs", "nifi_test/tstFile1.ext", "content other");
-  createFile(dst_dir / "vfs", "nifi_test/tstFile2.ext", "content other");
+  createFile((dst_dir / "vfs").string(), "nifi_test/tstFile1.ext", "content 
other");
+  createFile((dst_dir / "vfs").string(), "nifi_test/tstFile2.ext", "content 
other");
 
   testController.runSession(plan, true);
 
@@ -798,7 +800,7 @@ TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP put large 
file", "[PutSFTP]") {
   std::string content(4 * 1024 * 1024U, '\0');
   std::generate_n(content.begin(), 4 * 1024 * 1024U, std::ref(rng));
 
-  createFile(src_dir, "tstFile.ext", content);
+  createFile(src_dir.string(), "tstFile.ext", content);
 
   testController.runSession(plan, true);
 
@@ -867,7 +869,7 @@ TEST_CASE_METHOD(PutSFTPTestsFixture, "PutSFTP expression 
language test", "[PutS
   plan->setProperty(put, "Use Compression", "false");
   plan->setProperty(put, "Reject Zero-Byte Files", "true");
 
-  createFile(src_dir, "tstFile.ext", "some content");
+  createFile(src_dir.string(), "tstFile.ext", "some content");
 
   testController.runSession(plan, true);
 
diff --git a/thirdparty/libssh2/fix-windows-ioctl.patch 
b/thirdparty/libssh2/fix-windows-ioctl.patch
new file mode 100644
index 000000000..2c2c61841
--- /dev/null
+++ b/thirdparty/libssh2/fix-windows-ioctl.patch
@@ -0,0 +1,21 @@
+diff --git a/src/session.c b/src/session.c
+index 212560b8..5e4fc8db 100644
+--- a/src/session.c
++++ b/src/session.c
+@@ -291,15 +291,7 @@ session_nonblock(libssh2_socket_t sockfd,   /* operate on 
this */
+ #define SETBLOCK 1
+ #endif
+ 
+-#if defined(HAVE_FIONBIO) && (SETBLOCK == 0)
+-    /* older unix versions and VMS*/
+-    int flags;
+-
+-    flags = nonblock;
+-    return ioctl(sockfd, FIONBIO, &flags);
+-#undef SETBLOCK
+-#define SETBLOCK 2
+-#endif
++// removed ioctl() method since it is not supported on Windows
+ 
+ #if defined(HAVE_IOCTLSOCKET) && (SETBLOCK == 0)
+     /* Windows? */

Reply via email to