Tolerate problems when reading the contents of DCPs.
authorCarl Hetherington <cth@carlh.net>
Sun, 25 Jun 2023 20:34:47 +0000 (22:34 +0200)
committerCarl Hetherington <cth@carlh.net>
Sun, 25 Jun 2023 20:34:48 +0000 (22:34 +0200)
This avoids errors in cases like unreadable lost+found directories
appearing inside a DCP.

src/lib/dcp_content.cc

index e2b19fb8ee1b758876fac521ae1db2f0e5ad10af..442b5bd40ca24298e540a203f667655247384d2a 100644 (file)
@@ -50,6 +50,7 @@
 
 using std::cout;
 using std::dynamic_pointer_cast;
+using std::exception;
 using std::function;
 using std::list;
 using std::make_shared;
@@ -197,16 +198,20 @@ DCPContent::read_sub_directory (boost::filesystem::path p)
        using namespace boost::filesystem;
 
        LOG_GENERAL ("DCPContent::read_sub_directory reads %1", p.string());
-       for (auto i: directory_iterator(p)) {
-               if (is_regular_file(i.path())) {
-                       LOG_GENERAL ("Inside there's regular file %1", i.path().string());
-                       add_path (i.path());
-               } else if (is_directory(i.path()) && i.path().filename() != ".AppleDouble") {
-                       LOG_GENERAL ("Inside there's directory %1", i.path().string());
-                       read_sub_directory (i.path());
-               } else {
-                       LOG_GENERAL("Ignoring %1 from inside: status is %2", i.path().string(), static_cast<int>(status(i.path()).type()));
+       try {
+               for (auto i: directory_iterator(p)) {
+                       if (is_regular_file(i.path())) {
+                               LOG_GENERAL ("Inside there's regular file %1", i.path().string());
+                               add_path (i.path());
+                       } else if (is_directory(i.path()) && i.path().filename() != ".AppleDouble") {
+                               LOG_GENERAL ("Inside there's directory %1", i.path().string());
+                               read_sub_directory (i.path());
+                       } else {
+                               LOG_GENERAL("Ignoring %1 from inside: status is %2", i.path().string(), static_cast<int>(status(i.path()).type()));
+                       }
                }
+       } catch (exception& e) {
+               LOG_GENERAL("Failed to iterate over %1: %2", p.string(), e.what());
        }
 }