Switch to std::filesystem

Change-Id: Idd88815c8971a1dd6a592ac9d3f46d5925afd21b
diff --git a/.jenkins.d/00-deps.sh b/.jenkins.d/00-deps.sh
index bac6927..3f3235a 100755
--- a/.jenkins.d/00-deps.sh
+++ b/.jenkins.d/00-deps.sh
@@ -7,7 +7,6 @@
     libboost-chrono-dev
     libboost-date-time-dev
     libboost-dev
-    libboost-filesystem-dev
     libboost-iostreams-dev
     libboost-log-dev
     libboost-program-options-dev
diff --git a/.waf-tools/default-compiler-flags.py b/.waf-tools/default-compiler-flags.py
index 9899d05..090e65d 100644
--- a/.waf-tools/default-compiler-flags.py
+++ b/.waf-tools/default-compiler-flags.py
@@ -136,7 +136,7 @@
         return {
             'CXXFLAGS': [],
             'LINKFLAGS': [],
-            'DEFINES': ['BOOST_ASIO_NO_DEPRECATED', 'BOOST_FILESYSTEM_NO_DEPRECATED'],
+            'DEFINES': ['BOOST_ASIO_NO_DEPRECATED'],
         }
 
     def getOptimizedFlags(self, conf):
diff --git a/src/conf-file-processor.cpp b/src/conf-file-processor.cpp
index af0ad52..29f22cf 100644
--- a/src/conf-file-processor.cpp
+++ b/src/conf-file-processor.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2014-2023,  The University of Memphis,
+ * Copyright (c) 2014-2024,  The University of Memphis,
  *                           Regents of the University of California,
  *                           Arizona Board of Regents.
  *
@@ -29,16 +29,16 @@
 #include <ndn-cxx/util/io.hpp>
 
 #include <boost/algorithm/string.hpp>
-#include <boost/filesystem.hpp>
 #include <boost/property_tree/info_parser.hpp>
 
+#include <filesystem>
 #include <fstream>
 #include <iostream>
 
-namespace bf = boost::filesystem;
-
 namespace nlsr {
 
+namespace fs = std::filesystem;
+
 template <class T>
 class ConfigurationVariable
 {
@@ -330,14 +330,14 @@
     return false;
   }
 
+  // state-dir
   try {
-    std::string stateDir = section.get<std::string>("state-dir");
-    if (bf::exists(stateDir)) {
-      if (bf::is_directory(stateDir)) {
+    fs::path stateDir(section.get<std::string>("state-dir"));
+    if (fs::exists(stateDir)) {
+      if (fs::is_directory(stateDir)) {
         // copying nlsr.conf file to a user-defined directory for possible modification
-        std::string conFileDynamic = (bf::path(stateDir) / "nlsr.conf").string();
-
-        if (m_confFileName == conFileDynamic) {
+        auto conFileDynamic = stateDir / "nlsr.conf";
+        if (m_confFileName == conFileDynamic.string()) {
           std::cerr << "Please use nlsr.conf stored at another location "
                     << "or change the state-dir in the configuration." << std::endl;
           std::cerr << "The file at " << conFileDynamic <<
@@ -347,45 +347,39 @@
           return false;
         }
 
-        m_confParam.setConfFileNameDynamic(conFileDynamic);
+        m_confParam.setConfFileNameDynamic(conFileDynamic.string());
         try {
-          bf::copy_file(m_confFileName, conFileDynamic,
-#if BOOST_VERSION >= 107400
-                        bf::copy_options::overwrite_existing
-#else
-                        bf::copy_option::overwrite_if_exists
-#endif
-                        );
+          fs::copy_file(m_confFileName, conFileDynamic, fs::copy_options::overwrite_existing);
         }
-        catch (const bf::filesystem_error& e) {
-          std::cerr << "Error copying conf file to the state directory: " << e.what() << std::endl;
+        catch (const fs::filesystem_error& e) {
+          std::cerr << "Error copying conf file to state-dir: " << e.what() << std::endl;
           return false;
         }
 
-        std::string testFileName = (bf::path(stateDir) / "test.seq").string();
-        std::ofstream testOutFile(testFileName);
-        if (testOutFile) {
-          m_confParam.setStateFileDir(stateDir);
+        auto testFilePath = stateDir / "test.seq";
+        std::ofstream testFile(testFilePath);
+        if (testFile) {
+          m_confParam.setStateFileDir(stateDir.string());
         }
         else {
-          std::cerr << "NLSR does not have read/write permission on the state directory" << std::endl;
+          std::cerr << "NLSR does not have read/write permission on state-dir" << std::endl;
           return false;
         }
-        testOutFile.close();
-        remove(testFileName.c_str());
+        testFile.close();
+        fs::remove(testFilePath);
       }
       else {
-        std::cerr << "Provided path '" << stateDir << "' is not a directory" << std::endl;
+        std::cerr << "Provided state-dir " << stateDir << " is not a directory" << std::endl;
         return false;
       }
     }
     else {
-      std::cerr << "Provided state directory '" << stateDir << "' does not exist" << std::endl;
+      std::cerr << "Provided state-dir " << stateDir << " does not exist" << std::endl;
       return false;
     }
   }
   catch (const std::exception& ex) {
-    std::cerr << "You must configure state directory" << std::endl;
+    std::cerr << "You must configure state-dir" << std::endl;
     std::cerr << ex.what() << std::endl;
     return false;
   }
@@ -654,20 +648,19 @@
         return false;
       }
 
-      std::string file = it->second.data();
-      bf::path certfilePath = absolute(file, bf::path(m_confFileName).parent_path());
-      std::ifstream ifs(certfilePath.string());
+      fs::path certPath = fs::canonical(fs::path(m_confFileName).parent_path() / it->second.data());
+      std::ifstream ifs(certPath);
 
       ndn::security::Certificate idCert;
       try {
         idCert = ndn::io::loadTlv<ndn::security::Certificate>(ifs);
       }
       catch (const std::exception& e) {
-        std::cerr << "Error: Cannot load cert-to-publish '" << file << "': " << e.what() << std::endl;
+        std::cerr << "Error: Cannot load cert-to-publish " << certPath << ": " << e.what() << std::endl;
         return false;
       }
 
-      m_confParam.addCertPath(certfilePath.string());
+      m_confParam.addCertPath(certPath.string());
       m_confParam.loadCertToValidator(idCert);
     }
   }
diff --git a/tests/key-chain-fixture.cpp b/tests/key-chain-fixture.cpp
index f29153f..bae6ca7 100644
--- a/tests/key-chain-fixture.cpp
+++ b/tests/key-chain-fixture.cpp
@@ -27,7 +27,8 @@
 
 #include <ndn-cxx/util/io.hpp>
 
-#include <boost/filesystem/operations.hpp>
+#include <filesystem>
+#include <system_error>
 
 namespace nlsr::tests {
 
@@ -40,9 +41,9 @@
 
 KeyChainFixture::~KeyChainFixture()
 {
-  boost::system::error_code ec;
+  std::error_code ec;
   for (const auto& certFile : m_certFiles) {
-    boost::filesystem::remove(certFile, ec); // ignore error
+    std::filesystem::remove(certFile, ec); // ignore error
   }
 }
 
diff --git a/tests/security/test-certificate-store.cpp b/tests/security/test-certificate-store.cpp
index 484959e..b00744f 100644
--- a/tests/security/test-certificate-store.cpp
+++ b/tests/security/test-certificate-store.cpp
@@ -26,11 +26,11 @@
 #include "tests/io-key-chain-fixture.hpp"
 #include "tests/test-common.hpp"
 
-#include <boost/filesystem/operations.hpp>
-#include <boost/filesystem/path.hpp>
 #include <boost/lexical_cast.hpp>
 #include <boost/property_tree/info_parser.hpp>
 
+#include <filesystem>
+
 namespace nlsr::tests {
 
 class CertificateStoreFixture : public IoKeyChainFixture
@@ -50,7 +50,7 @@
     , nlsr(face, m_keyChain, conf)
     , lsdb(nlsr.getLsdb())
     , certStore(face, conf, lsdb)
-    , ROOT_CERT_PATH(boost::filesystem::current_path() / "root.cert")
+    , ROOT_CERT_PATH(std::filesystem::current_path() / "root.cert")
   {
     rootId = m_keyChain.createIdentity(rootIdName);
     siteIdentity = addSubCertificate(siteIdentityName, rootId);
@@ -112,7 +112,7 @@
   ndn::security::Certificate certificate;
   ndn::Name certificateKey;
   security::CertificateStore certStore;
-  const boost::filesystem::path ROOT_CERT_PATH;
+  const std::filesystem::path ROOT_CERT_PATH;
 };
 
 BOOST_FIXTURE_TEST_SUITE(TestCertificateStore, CertificateStoreFixture)
diff --git a/tests/test-lsa-rule.cpp b/tests/test-lsa-rule.cpp
index 87f915d..ddd5969 100644
--- a/tests/test-lsa-rule.cpp
+++ b/tests/test-lsa-rule.cpp
@@ -25,12 +25,12 @@
 #include "tests/io-key-chain-fixture.hpp"
 #include "tests/test-common.hpp"
 
-#include <boost/filesystem/operations.hpp>
-#include <boost/filesystem/path.hpp>
 #include <boost/lexical_cast.hpp>
 #include <boost/property_tree/info_parser.hpp>
 #include <boost/property_tree/ptree.hpp>
 
+#include <filesystem>
+
 namespace nlsr::tests {
 
 using namespace ndn;
@@ -48,7 +48,7 @@
     , confProcessor(confParam, SyncProtocol::PSYNC, HYPERBOLIC_STATE_OFF,
                     "/ndn/", "/edu/test-site", "/%C1.Router/router1")
     , lsdb(face, m_keyChain, confParam)
-    , ROOT_CERT_PATH(boost::filesystem::current_path() / std::string("root.cert"))
+    , ROOT_CERT_PATH(std::filesystem::current_path() / "root.cert")
   {
     rootId = m_keyChain.createIdentity(rootIdName);
     siteIdentity = addSubCertificate(siteIdentityName, rootId);
@@ -92,7 +92,7 @@
   DummyConfFileProcessor confProcessor;
   Lsdb lsdb;
 
-  const boost::filesystem::path ROOT_CERT_PATH;
+  const std::filesystem::path ROOT_CERT_PATH;
 };
 
 BOOST_FIXTURE_TEST_SUITE(TestLsaDataValidation, LsaRuleFixture)
diff --git a/tests/test-sequencing-manager.cpp b/tests/test-sequencing-manager.cpp
index dd098c0..9941d1d 100644
--- a/tests/test-sequencing-manager.cpp
+++ b/tests/test-sequencing-manager.cpp
@@ -23,8 +23,9 @@
 
 #include "tests/boost-test.hpp"
 
-#include <boost/filesystem/operations.hpp>
+#include <filesystem>
 #include <fstream>
+#include <system_error>
 
 namespace nlsr::tests {
 
@@ -33,22 +34,17 @@
 class SequencingManagerFixture
 {
 public:
-  SequencingManagerFixture()
-    : m_seqManager("/tmp", HYPERBOLIC_STATE_OFF)
-  {
-  }
-
   ~SequencingManagerFixture()
   {
-    boost::filesystem::remove(seqFile);
+    std::error_code ec;
+    std::filesystem::remove(m_seqFile, ec); // ignore error
   }
 
   void
   writeToFile(const std::string& testSeq)
   {
-    std::ofstream outputFile(seqFile, std::ofstream::trunc);
+    std::ofstream outputFile(m_seqFile, std::ofstream::trunc);
     outputFile << testSeq;
-    outputFile.close();
   }
 
   void
@@ -66,8 +62,10 @@
   }
 
 public:
-  std::string seqFile = "/tmp/nlsrSeqNo.txt";
-  SequencingManager m_seqManager;
+  SequencingManager m_seqManager{"/tmp", HYPERBOLIC_STATE_OFF};
+
+private:
+  std::filesystem::path m_seqFile{"/tmp/nlsrSeqNo.txt"};
 };
 
 BOOST_FIXTURE_TEST_SUITE(TestSequencingManager, SequencingManagerFixture)
diff --git a/tests/update/test-prefix-update-processor.cpp b/tests/update/test-prefix-update-processor.cpp
index 493d73d..229e2d3 100644
--- a/tests/update/test-prefix-update-processor.cpp
+++ b/tests/update/test-prefix-update-processor.cpp
@@ -29,12 +29,12 @@
 #include <ndn-cxx/security/interest-signer.hpp>
 #include <ndn-cxx/security/signing-helpers.hpp>
 
-#include <boost/filesystem/operations.hpp>
-#include <boost/filesystem/path.hpp>
 #include <boost/lexical_cast.hpp>
 #include <boost/property_tree/info_parser.hpp>
 #include <boost/property_tree/ptree.hpp>
 
+#include <filesystem>
+
 namespace nlsr::tests {
 
 using namespace ndn;
@@ -50,7 +50,7 @@
     , confProcessor(conf)
     , nlsr(face, m_keyChain, conf)
     , namePrefixList(conf.getNamePrefixList())
-    , SITE_CERT_PATH(boost::filesystem::current_path() / std::string("site.cert"))
+    , SITE_CERT_PATH(std::filesystem::current_path() / "site.cert")
   {
     // Site cert
     siteIdentity = m_keyChain.createIdentity(siteIdentityName);
@@ -139,7 +139,7 @@
   Nlsr nlsr;
   NamePrefixList& namePrefixList;
 
-  const boost::filesystem::path SITE_CERT_PATH;
+  const std::filesystem::path SITE_CERT_PATH;
 };
 
 BOOST_FIXTURE_TEST_SUITE(TestPrefixUpdateProcessor, PrefixUpdateFixture)
diff --git a/tests/update/test-save-delete-prefix.cpp b/tests/update/test-save-delete-prefix.cpp
index ef38cef..5c582cd 100644
--- a/tests/update/test-save-delete-prefix.cpp
+++ b/tests/update/test-save-delete-prefix.cpp
@@ -30,10 +30,10 @@
 #include <ndn-cxx/security/interest-signer.hpp>
 #include <ndn-cxx/security/signing-helpers.hpp>
 
-#include <boost/filesystem/operations.hpp>
-#include <boost/filesystem/path.hpp>
 #include <boost/property_tree/info_parser.hpp>
 
+#include <filesystem>
+
 namespace nlsr::tests {
 
 namespace bpt = boost::property_tree;
@@ -49,7 +49,7 @@
     , conf(face, m_keyChain, testConfFile)
     , confProcessor(conf)
     , nlsr(face, m_keyChain, conf)
-    , SITE_CERT_PATH(boost::filesystem::current_path() / std::string("site.cert"))
+    , SITE_CERT_PATH(std::filesystem::current_path() / "site.cert")
     , counter(0)
   {
     std::ifstream source("nlsr.conf", std::ios::binary);
@@ -69,6 +69,7 @@
     std::ifstream inputFile;
     inputFile.open(testConfFile);
     BOOST_REQUIRE(inputFile.is_open());
+
     bpt::ptree pt;
     bpt::read_info(inputFile, pt);
     // Loads section and file name
@@ -164,7 +165,7 @@
   ConfParameter conf;
   DummyConfFileProcessor confProcessor;
   Nlsr nlsr;
-  const boost::filesystem::path SITE_CERT_PATH;
+  const std::filesystem::path SITE_CERT_PATH;
   ndn::Name sessionTime;
   int counter;
 };
diff --git a/wscript b/wscript
index fbadf9f..be9030c 100644
--- a/wscript
+++ b/wscript
@@ -72,7 +72,7 @@
     conf.check_cfg(package='libndn-cxx', args=['libndn-cxx >= 0.9.0', '--cflags', '--libs'],
                    uselib_store='NDN_CXX', pkg_config_path=pkg_config_path)
 
-    conf.check_boost(lib='filesystem', mt=True)
+    conf.check_boost()
     if conf.env.BOOST_VERSION_NUMBER < 107100:
         conf.fatal('The minimum supported version of Boost is 1.71.0.\n'
                    'Please upgrade your distribution or manually install a newer version of Boost.\n'