[libcxx] Map ERROR_BAD_PATHNAME to errc::no_such_file_or_directory on windows
authorMartin Storsjö <martin@martin.st>
Sat, 27 Feb 2021 14:09:49 +0000 (16:09 +0200)
committerMartin Storsjö <martin@martin.st>
Fri, 5 Mar 2021 08:49:03 +0000 (10:49 +0200)
commit29012ce986fcb24175f19317b4e2d119cd8cdbb2
treeda6e6b1ee5af152d58f778dd08d847f363a627a1
parent99c7b532946508efcf6cd978d86ee24b2a66d096
[libcxx] Map ERROR_BAD_PATHNAME to errc::no_such_file_or_directory on windows

Opening a path like \\server (without a trailing share name and
path) produces this error, while opening e.g. \\server\share
(for a nonexistent server/share) produces ERROR_BAD_NETPATH (which
already is mapped).

This happens in some testcases (in fs.op.proximate); as proximate()
calls weakly_canonical() on the inputs, weakly_canonical() checks
whether the path exists or not. When the error code wasn't recognized
(it mapped to errc::invalid_argument), the stat operation wasn't
conclusive and weakly_canonical() errored out. With the proper error
code mapping, this isn't considered an error, just a nonexistent
path, and weakly_canonical() can proceed.

This roughly matches what MS STL does - it doesn't have
ERROR_BAD_PATHNAME in its error code mapping table, but it
checks for this error code specifically in the return of their
correspondence of the stat function.

Differential Revision: https://reviews.llvm.org/D97619
libcxx/src/filesystem/operations.cpp