} else {
dir = fdopendir(fd); // Takes over ownership of fd.
if (dir == nullptr) {
- perror("fdopendir");
- exit(1);
+ // fdopendir() wants to fstat() the fd to verify that it's indeed
+ // a directory, which can seemingly fail on at least CIFS filesystems
+ // if the server feels like it. We treat this as if we had an error
+ // on opening it, ie., ignore the directory.
+ close(fd);
+ return 0;
}
dirent *de;
struct stat buf;
if (fstat(e.fd, &buf) != 0) {
- perror(path.c_str());
+ // It's possible that this is a filesystem that's excluded
+ // (and the failure is e.g. because the network is down).
+ // As a last-ditch effort, we try to check that before dying,
+ // i.e., duplicate the check from further down.
+ //
+ // It would be better to be able to run filesystem_is_excluded()
+ // for cheap on everything and just avoid the stat, but it seems
+ // hard to do that without any kind of raciness.
+ if (filesystem_is_excluded((path_plus_slash + e.name).c_str())) {
+ close(e.fd);
+ e.fd = -1;
+ continue;
+ }
+
+ perror((path_plus_slash + e.name).c_str());
exit(1);
}