]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Add utility for creating std::error_code from OS errors
authorJonathan Wakely <jwakely@redhat.com>
Wed, 10 Feb 2021 18:00:00 +0000 (18:00 +0000)
committerJonathan Wakely <jwakely@redhat.com>
Fri, 1 Oct 2021 19:34:49 +0000 (20:34 +0100)
This adds a helper function to encapsulate obtaining an error code for
errors from OS calls. For Windows we want to use GetLastError() and the
system error category, but otherwise just use errno and the generic
error category.

This should not be used to replace existing uses of
ec.assign(errno, generic_category()) because in those cases we really do
want to get the value of errno, not a system-specific error. Only the
cases that currently use GetLastError() are replace by this new
function.

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:

* src/filesystem/ops-common.h (last_error): New helper function.
(filesystem::do_space): Use last_error().
* src/c++17/fs_ops.cc (fs::absolute, fs::create_hard_link)
(fs::equivalent, fs::remove, fs::temp_directory_path): Use
last_error().
* src/filesystem/ops.cc (fs::create_hard_link)
(fs::remove, fs::temp_directory_path): Likewise.

libstdc++-v3/src/c++17/fs_ops.cc
libstdc++-v3/src/filesystem/ops-common.h
libstdc++-v3/src/filesystem/ops.cc

index 2eac9977785f007f2aa2fbc237818e68ad027dfe..4f3715bbbec07b5b3b7851e68e514c07eae38384 100644 (file)
@@ -113,7 +113,7 @@ fs::absolute(const path& p, error_code& ec)
   while (len > buf.size());
 
   if (len == 0)
-    ec.assign((int)GetLastError(), std::system_category());
+    ec = __last_system_error();
   else
     {
       buf.resize(len);
@@ -682,7 +682,7 @@ fs::create_hard_link(const path& to, const path& new_hard_link,
   if (CreateHardLinkW(new_hard_link.c_str(), to.c_str(), NULL))
     ec.clear();
   else
-    ec.assign((int)GetLastError(), system_category());
+    ec = __last_system_error();
 #else
   ec = std::make_error_code(std::errc::not_supported);
 #endif
@@ -874,12 +874,12 @@ fs::equivalent(const path& p1, const path& p2, error_code& ec) noexcept
       if (!h1 || !h2)
        {
          if (!h1 && !h2)
-           ec.assign((int)GetLastError(), system_category());
+           ec = __last_system_error();
          return false;
        }
       if (!h1.get_info() || !h2.get_info())
        {
-         ec.assign((int)GetLastError(), system_category());
+         ec = __last_system_error();
          return false;
        }
       return h1.info.dwVolumeSerialNumber == h2.info.dwVolumeSerialNumber
@@ -1255,7 +1255,7 @@ fs::remove(const path& p, error_code& ec) noexcept
          return true;
        }
       else if (!ec)
-       ec.assign((int)GetLastError(), system_category());
+       ec = __last_system_error();
     }
   else if (status_known(st))
     ec.clear();
index bf26c06b7b5ce12c845c796c0a84d5c4135a3726..e999e11b422d161b449ab3726910b1f3948ed602 100644 (file)
 namespace std _GLIBCXX_VISIBILITY(default)
 {
 _GLIBCXX_BEGIN_NAMESPACE_VERSION
+
+  // Get the last OS error (for POSIX this is just errno).
+  inline error_code
+  __last_system_error() noexcept
+  {
+#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
+    return {::GetLastError(), std::system_category()};
+#else
+    return {errno, std::generic_category()};
+#endif
+  }
+
 namespace filesystem
 {
 namespace __gnu_posix
@@ -558,7 +570,7 @@ _GLIBCXX_BEGIN_NAMESPACE_FILESYSTEM
        ec.clear();
       }
     else
-      ec.assign((int)GetLastError(), std::system_category());
+      ec = std::last_system_error();
 #else
     ec = std::make_error_code(std::errc::not_supported);
 #endif
@@ -583,7 +595,7 @@ _GLIBCXX_BEGIN_NAMESPACE_FILESYSTEM
       } while (len > buf.size());
 
     if (len == 0)
-      ec.assign((int)GetLastError(), std::system_category());
+      ec = __last_system_error();
     else
       ec.clear();
 
index b0a0f15e98fd7cc3290d46cb2d2ee5f5981653c4..cc7117b0cd1b3e8723d83363d1f91e50e5764696 100644 (file)
@@ -590,7 +590,7 @@ fs::create_hard_link(const path& to, const path& new_hard_link,
   if (CreateHardLinkW(new_hard_link.c_str(), to.c_str(), NULL))
     ec.clear();
   else
-    ec.assign((int)GetLastError(), system_category());
+    ec = __last_system_error();
 #else
   ec = std::make_error_code(std::errc::not_supported);
 #endif
@@ -1062,7 +1062,7 @@ fs::remove(const path& p, error_code& ec) noexcept
          return true;
        }
       else if (!ec)
-       ec.assign((int)GetLastError(), system_category());
+       ec = __last_system_error();
     }
   else if (status_known(st))
     ec.clear();