Fills buffer with cryptographically random data obtained from getrandom()
| 172 | |
| 173 | //! Fills buffer with cryptographically random data obtained from getrandom() |
| 174 | int fill_random_getrandom(void* buf, std::size_t len) |
| 175 | { |
| 176 | std::size_t bytes_read = 0u; |
| 177 | while (bytes_read < len) |
| 178 | { |
| 179 | #if defined(BOOST_FILESYSTEM_HAS_GETRANDOM) |
| 180 | ssize_t n = ::getrandom(buf, len - bytes_read, 0u); |
| 181 | #else |
| 182 | ssize_t n = ::syscall(SYS_getrandom, buf, len - bytes_read, 0u); |
| 183 | #endif |
| 184 | if (BOOST_UNLIKELY(n < 0)) |
| 185 | { |
| 186 | const int err = errno; |
| 187 | if (err == EINTR) |
| 188 | continue; |
| 189 | |
| 190 | if (err == ENOSYS && bytes_read == 0u) |
| 191 | { |
| 192 | filesystem::detail::atomic_store_relaxed(fill_random, &fill_random_dev_random); |
| 193 | return fill_random_dev_random(buf, len); |
| 194 | } |
| 195 | |
| 196 | return err; |
| 197 | } |
| 198 | |
| 199 | bytes_read += n; |
| 200 | buf = static_cast< char* >(buf) + n; |
| 201 | } |
| 202 | |
| 203 | return 0; |
| 204 | } |
| 205 | |
| 206 | #endif // defined(BOOST_FILESYSTEM_HAS_GETRANDOM) || defined(BOOST_FILESYSTEM_HAS_GETRANDOM_SYSCALL) |
| 207 |
nothing calls this directly
no test coverage detected