On Mon, 27 Jun 2022 at 15:00, Jonathan Wakely <jwak...@redhat.com> wrote: > > On Mon, 27 Jun 2022 at 14:32, Jonathan Wakely <jwak...@redhat.com> wrote: > > > > On Mon, 27 Jun 2022 at 14:05, Alexandre Oliva <ol...@adacore.com> wrote: > > > > > > On Jun 27, 2022, Alexandre Oliva <ol...@adacore.com> wrote: > > > > > > > It looks like the atp.pathname is missing the nonexistent_path > > > > assigned to variable dir in test_pr99290, so we attempt to open > > > > subdirs thereof as if with openat. > > > > > > This appears to be caused by the early return in fs::_Dir's ctor: > > > > > > _Dir(const fs::path& p, bool skip_permission_denied, bool nofollow, > > > [[maybe_unused]] bool filename_only, error_code& ec) > > > : _Dir_base(p.c_str(), skip_permission_denied, nofollow, ec) > > > { > > > #if _GLIBCXX_HAVE_DIRFD // && 0 > > > if (filename_only) > > > return; // Do not store path p when we aren't going to use it. > > > #endif > > > > Yes, this needs a fix. If we don't have openat then we always need a > > full path relative to the CWD, not just a filename relative to a file > > descriptor for the parent directory. > > > > I think we need to store the directory's path if any of dirfd, openat > > or unlinkat is missing.
i.e. --- a/libstdc++-v3/src/c++17/fs_dir.cc +++ b/libstdc++-v3/src/c++17/fs_dir.cc @@ -48,7 +48,7 @@ struct fs::_Dir : _Dir_base [[maybe_unused]] bool filename_only, error_code& ec) : _Dir_base(p.c_str(), skip_permission_denied, nofollow, ec) { -#if _GLIBCXX_HAVE_DIRFD +#if _GLIBCXX_HAVE_DIRFD && _GLIBCXX_HAVE_OPENAT && _GLIBCXX_HAVE_UNLINKAT if (filename_only) return; // Do not store path p when we aren't going to use it. #endif > > > > > > > > > > if (!ec) > > > path = p; > > > } > > > > > > but somehow disabling the early return to force the saving of path > > > appears to break copy(): copy.cc's test01() succeeded without the '&& 0' > > > that I've commented-out above, but started failing to create 'to' in the > > > copy at line copy.cc:54 when I put it in to prevent the early return. N.B. it's not supposed to create 'to' there, that line is checking that it fails and reports an error. Could the FAIL simply be that rtems gives a different error, not EISDIR as the test expects? VERIFY( ec == std::make_error_code(std::errc::is_a_directory) ); Although that shouldn't depend on anything target-specific, because the libstdc++ code itself reports that error: else if (is_directory(f) && create_symlinks) ec = std::make_error_code(errc::is_a_directory);