1//===-------------------------- random.cpp --------------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#if defined(_WIN32)
11// Must be defined before including stdlib.h to enable rand_s().
12#define _CRT_RAND_S
13#include <stdio.h>
14#endif
15
16#include "random"
17#include "system_error"
18
19#ifdef __sun__
20#define rename solaris_headers_are_broken
21#endif
22#if !defined(_WIN32)
23#include <fcntl.h>
24#include <unistd.h>
25#endif // defined(_WIN32)
26#include <errno.h>
27
28_LIBCPP_BEGIN_NAMESPACE_STD
29
30#if defined(_WIN32)
31random_device::random_device(const string&)
32{
33}
34
35random_device::~random_device()
36{
37}
38
39unsigned
40random_device::operator()()
41{
42    unsigned r;
43    errno_t err = rand_s(&r);
44    if (err)
45        __throw_system_error(err, "random_device rand_s failed.");
46    return r;
47}
48#else
49random_device::random_device(const string& __token)
50    : __f_(open(__token.c_str(), O_RDONLY))
51{
52    if (__f_ <= 0)
53        __throw_system_error(errno, ("random_device failed to open " + __token).c_str());
54}
55
56random_device::~random_device()
57{
58    close(__f_);
59}
60
61unsigned
62random_device::operator()()
63{
64    unsigned r;
65    read(__f_, &r, sizeof(r));
66    return r;
67}
68#endif // defined(_WIN32)
69
70double
71random_device::entropy() const _NOEXCEPT
72{
73    return 0;
74}
75
76_LIBCPP_END_NAMESPACE_STD
77