summaryrefslogtreecommitdiffstats
path: root/contrib/restricted/boost/filesystem/src/unique_path.cpp
diff options
context:
space:
mode:
authorthegeorg <[email protected]>2023-01-12 19:17:36 +0300
committerthegeorg <[email protected]>2023-01-12 19:17:36 +0300
commit4229f87c89bfb36eded667ec1e64f41b1aeb88b9 (patch)
tree9dd29a868ccac7990c4502957848ca07acd12ac6 /contrib/restricted/boost/filesystem/src/unique_path.cpp
parentb48a7948c3aec8c078a24714d4da420a6225d09f (diff)
Update contrib/restricted/boost/spirit to 1.81.0
Diffstat (limited to 'contrib/restricted/boost/filesystem/src/unique_path.cpp')
-rw-r--r--contrib/restricted/boost/filesystem/src/unique_path.cpp331
1 files changed, 0 insertions, 331 deletions
diff --git a/contrib/restricted/boost/filesystem/src/unique_path.cpp b/contrib/restricted/boost/filesystem/src/unique_path.cpp
deleted file mode 100644
index f0bc6058cb2..00000000000
--- a/contrib/restricted/boost/filesystem/src/unique_path.cpp
+++ /dev/null
@@ -1,331 +0,0 @@
-// filesystem unique_path.cpp --------------------------------------------------------//
-
-// Copyright Beman Dawes 2010
-// Copyright Andrey Semashev 2020
-
-// Distributed under the Boost Software License, Version 1.0.
-// See http://www.boost.org/LICENSE_1_0.txt
-
-// Library home page: http://www.boost.org/libs/filesystem
-
-//--------------------------------------------------------------------------------------//
-
-#include "platform_config.hpp"
-
-#include <boost/predef/library/c/cloudabi.h>
-#include <boost/predef/os/bsd/open.h>
-#include <boost/predef/os/bsd/free.h>
-
-#ifdef BOOST_POSIX_API
-
-#include <cerrno>
-#include <stddef.h>
-#include <fcntl.h>
-#ifdef BOOST_HAS_UNISTD_H
-#include <unistd.h>
-#endif
-
-#if !defined(BOOST_FILESYSTEM_DISABLE_ARC4RANDOM)
-#if BOOST_OS_BSD_OPEN >= BOOST_VERSION_NUMBER(2, 1, 0) || \
- BOOST_OS_BSD_FREE >= BOOST_VERSION_NUMBER(8, 0, 0) || \
- BOOST_LIB_C_CLOUDABI
-#include <stdlib.h>
-#define BOOST_FILESYSTEM_HAS_ARC4RANDOM
-#endif
-#endif // !defined(BOOST_FILESYSTEM_DISABLE_ARC4RANDOM)
-
-#if !defined(BOOST_FILESYSTEM_DISABLE_GETRANDOM)
-#if (defined(__linux__) || defined(__linux) || defined(linux)) && \
- (!defined(__ANDROID__) || __ANDROID_API__ >= 28)
-#include <sys/syscall.h>
-#if defined(SYS_getrandom)
-#define BOOST_FILESYSTEM_HAS_GETRANDOM_SYSCALL
-#endif // defined(SYS_getrandom)
-#if defined(__has_include)
-#if __has_include(<sys/random.h>)
-#define BOOST_FILESYSTEM_HAS_GETRANDOM
-#endif
-#elif defined(__GLIBC__)
-#if __GLIBC_PREREQ(2, 25)
-#define BOOST_FILESYSTEM_HAS_GETRANDOM
-#endif
-#endif // BOOST_FILESYSTEM_HAS_GETRANDOM definition
-#if defined(BOOST_FILESYSTEM_HAS_GETRANDOM)
-#include <sys/random.h>
-#endif
-#endif // (defined(__linux__) || defined(__linux) || defined(linux)) && (!defined(__ANDROID__) || __ANDROID_API__ >= 28)
-#endif // !defined(BOOST_FILESYSTEM_DISABLE_GETRANDOM)
-
-#include "posix_tools.hpp"
-
-#else // BOOST_WINDOWS_API
-
-// We use auto-linking below to help users of static builds of Boost.Filesystem to link to whatever Windows SDK library we selected.
-// The dependency information is currently not exposed in CMake config files generated by Boost.Build (https://github.com/boostorg/boost_install/issues/18),
-// which makes it non-trivial for users to discover the libraries they need. This feature is deprecated and may be removed in the future,
-// when the situation with CMake config files improves.
-// Note that the library build system is the principal source of linking the library, which must work regardless of auto-linking.
-#include <boost/predef/platform.h>
-#include <boost/winapi/basic_types.hpp>
-
-#if defined(BOOST_FILESYSTEM_HAS_BCRYPT) // defined on the command line by the project
-#include <boost/winapi/error_codes.hpp>
-#include <boost/winapi/bcrypt.hpp>
-#if !defined(BOOST_FILESYSTEM_NO_DEPRECATED) && defined(_MSC_VER)
-#pragma comment(lib, "bcrypt.lib")
-#endif // !defined(BOOST_FILESYSTEM_NO_DEPRECATED) && defined(_MSC_VER)
-#else // defined(BOOST_FILESYSTEM_HAS_BCRYPT)
-#include <boost/winapi/crypt.hpp>
-#include <boost/winapi/get_last_error.hpp>
-#if !defined(BOOST_FILESYSTEM_NO_DEPRECATED) && defined(_MSC_VER)
-#if !defined(_WIN32_WCE)
-#pragma comment(lib, "advapi32.lib")
-#else
-#pragma comment(lib, "coredll.lib")
-#endif
-#endif // !defined(BOOST_FILESYSTEM_NO_DEPRECATED) && defined(_MSC_VER)
-#endif // defined(BOOST_FILESYSTEM_HAS_BCRYPT)
-
-#endif // BOOST_POSIX_API
-
-#include <cstddef>
-#include <boost/filesystem/config.hpp>
-#include <boost/filesystem/operations.hpp>
-#include "private_config.hpp"
-#include "atomic_tools.hpp"
-#include "error_handling.hpp"
-
-#include <boost/filesystem/detail/header.hpp> // must be the last #include
-
-#if defined(BOOST_POSIX_API)
-// At least Mac OS X 10.6 and older doesn't support O_CLOEXEC
-#ifndef O_CLOEXEC
-#define O_CLOEXEC 0
-#endif
-#endif // defined(BOOST_POSIX_API)
-
-namespace boost {
-namespace filesystem {
-namespace detail {
-
-namespace {
-
-#if defined(BOOST_POSIX_API) && !defined(BOOST_FILESYSTEM_HAS_ARC4RANDOM)
-
-//! Fills buffer with cryptographically random data obtained from /dev/(u)random
-int fill_random_dev_random(void* buf, std::size_t len)
-{
- int file = ::open("/dev/urandom", O_RDONLY | O_CLOEXEC);
- if (file == -1)
- {
- file = ::open("/dev/random", O_RDONLY | O_CLOEXEC);
- if (file == -1)
- return errno;
- }
-
- std::size_t bytes_read = 0u;
- while (bytes_read < len)
- {
- ssize_t n = ::read(file, buf, len - bytes_read);
- if (BOOST_UNLIKELY(n == -1))
- {
- int err = errno;
- if (err == EINTR)
- continue;
- close_fd(file);
- return err;
- }
- bytes_read += n;
- buf = static_cast< char* >(buf) + n;
- }
-
- close_fd(file);
- return 0;
-}
-
-#if defined(BOOST_FILESYSTEM_HAS_GETRANDOM) || defined(BOOST_FILESYSTEM_HAS_GETRANDOM_SYSCALL)
-
-typedef int fill_random_t(void* buf, std::size_t len);
-
-//! Pointer to the implementation of fill_random.
-fill_random_t* fill_random = &fill_random_dev_random;
-
-//! Fills buffer with cryptographically random data obtained from getrandom()
-int fill_random_getrandom(void* buf, std::size_t len)
-{
- std::size_t bytes_read = 0u;
- while (bytes_read < len)
- {
-#if defined(BOOST_FILESYSTEM_HAS_GETRANDOM)
- ssize_t n = ::getrandom(buf, len - bytes_read, 0u);
-#else
- ssize_t n = ::syscall(SYS_getrandom, buf, len - bytes_read, 0u);
-#endif
- if (BOOST_UNLIKELY(n < 0))
- {
- const int err = errno;
- if (err == EINTR)
- continue;
-
- if (err == ENOSYS && bytes_read == 0u)
- {
- filesystem::detail::atomic_store_relaxed(fill_random, &fill_random_dev_random);
- return fill_random_dev_random(buf, len);
- }
-
- return err;
- }
-
- bytes_read += n;
- buf = static_cast< char* >(buf) + n;
- }
-
- return 0;
-}
-
-#endif // defined(BOOST_FILESYSTEM_HAS_GETRANDOM) || defined(BOOST_FILESYSTEM_HAS_GETRANDOM_SYSCALL)
-
-#endif // defined(BOOST_POSIX_API) && !defined(BOOST_FILESYSTEM_HAS_ARC4RANDOM)
-
-void system_crypt_random(void* buf, std::size_t len, boost::system::error_code* ec)
-{
-#if defined(BOOST_POSIX_API)
-
-#if defined(BOOST_FILESYSTEM_HAS_GETRANDOM) || defined(BOOST_FILESYSTEM_HAS_GETRANDOM_SYSCALL)
-
- int err = filesystem::detail::atomic_load_relaxed(fill_random)(buf, len);
- if (BOOST_UNLIKELY(err != 0))
- emit_error(err, ec, "boost::filesystem::unique_path");
-
-#elif defined(BOOST_FILESYSTEM_HAS_ARC4RANDOM)
-
- arc4random_buf(buf, len);
-
-#else
-
- int err = fill_random_dev_random(buf, len);
- if (BOOST_UNLIKELY(err != 0))
- emit_error(err, ec, "boost::filesystem::unique_path");
-
-#endif
-
-#else // defined(BOOST_POSIX_API)
-
-#if defined(BOOST_FILESYSTEM_HAS_BCRYPT)
-
- boost::winapi::BCRYPT_ALG_HANDLE_ handle;
- boost::winapi::NTSTATUS_ status = boost::winapi::BCryptOpenAlgorithmProvider(&handle, boost::winapi::BCRYPT_RNG_ALGORITHM_, NULL, 0);
- if (BOOST_UNLIKELY(status != 0))
- {
- fail:
- emit_error(translate_ntstatus(status), ec, "boost::filesystem::unique_path");
- return;
- }
-
- status = boost::winapi::BCryptGenRandom(handle, static_cast< boost::winapi::PUCHAR_ >(buf), static_cast< boost::winapi::ULONG_ >(len), 0);
-
- boost::winapi::BCryptCloseAlgorithmProvider(handle, 0);
-
- if (BOOST_UNLIKELY(status != 0))
- goto fail;
-
-#else // defined(BOOST_FILESYSTEM_HAS_BCRYPT)
-
- boost::winapi::HCRYPTPROV_ handle;
- boost::winapi::DWORD_ err = 0u;
- if (BOOST_UNLIKELY(!boost::winapi::CryptAcquireContextW(&handle, NULL, NULL, boost::winapi::PROV_RSA_FULL_, boost::winapi::CRYPT_VERIFYCONTEXT_ | boost::winapi::CRYPT_SILENT_)))
- {
- err = boost::winapi::GetLastError();
-
- fail:
- emit_error(err, ec, "boost::filesystem::unique_path");
- return;
- }
-
- boost::winapi::BOOL_ gen_ok = boost::winapi::CryptGenRandom(handle, static_cast< boost::winapi::DWORD_ >(len), static_cast< boost::winapi::BYTE_* >(buf));
-
- if (BOOST_UNLIKELY(!gen_ok))
- err = boost::winapi::GetLastError();
-
- boost::winapi::CryptReleaseContext(handle, 0);
-
- if (BOOST_UNLIKELY(!gen_ok))
- goto fail;
-
-#endif // defined(BOOST_FILESYSTEM_HAS_BCRYPT)
-
-#endif // defined(BOOST_POSIX_API)
-}
-
-#ifdef BOOST_WINDOWS_API
-BOOST_CONSTEXPR_OR_CONST wchar_t hex[] = L"0123456789abcdef";
-BOOST_CONSTEXPR_OR_CONST wchar_t percent = L'%';
-#else
-BOOST_CONSTEXPR_OR_CONST char hex[] = "0123456789abcdef";
-BOOST_CONSTEXPR_OR_CONST char percent = '%';
-#endif
-
-} // unnamed namespace
-
-#if defined(linux) || defined(__linux) || defined(__linux__)
-
-//! Initializes fill_random implementation pointer
-void init_fill_random_impl(unsigned int major_ver, unsigned int minor_ver, unsigned int patch_ver)
-{
-#if defined(BOOST_FILESYSTEM_HAS_INIT_PRIORITY) && \
- (defined(BOOST_FILESYSTEM_HAS_GETRANDOM) || defined(BOOST_FILESYSTEM_HAS_GETRANDOM_SYSCALL))
- fill_random_t* fr = &fill_random_dev_random;
-
- if (major_ver > 3u || (major_ver == 3u && minor_ver >= 17u))
- fr = &fill_random_getrandom;
-
- filesystem::detail::atomic_store_relaxed(fill_random, fr);
-#endif
-}
-
-#endif // defined(linux) || defined(__linux) || defined(__linux__)
-
-BOOST_FILESYSTEM_DECL
-path unique_path(path const& model, system::error_code* ec)
-{
- // This function used wstring for fear of misidentifying
- // a part of a multibyte character as a percent sign.
- // However, double byte encodings only have 80-FF as lead
- // bytes and 40-7F as trailing bytes, whereas % is 25.
- // So, use string on POSIX and avoid conversions.
-
- path::string_type s(model.native());
-
- char ran[16] = {}; // init to avoid clang static analyzer message
- // see ticket #8954
- BOOST_CONSTEXPR_OR_CONST unsigned int max_nibbles = 2u * sizeof(ran); // 4-bits per nibble
-
- unsigned int nibbles_used = max_nibbles;
- for (path::string_type::size_type i = 0, n = s.size(); i < n; ++i)
- {
- if (s[i] == percent) // digit request
- {
- if (nibbles_used == max_nibbles)
- {
- system_crypt_random(ran, sizeof(ran), ec);
- if (ec && *ec)
- return path();
- nibbles_used = 0;
- }
- unsigned int c = ran[nibbles_used / 2u];
- c >>= 4u * (nibbles_used++ & 1u); // if odd, shift right 1 nibble
- s[i] = hex[c & 0xf]; // convert to hex digit and replace
- }
- }
-
- if (ec)
- ec->clear();
-
- return s;
-}
-
-} // namespace detail
-} // namespace filesystem
-} // namespace boost
-
-#include <boost/filesystem/detail/footer.hpp>