8 #include <botan/internal/es_unix.h>
9 #include <botan/internal/unix_cmd.h>
10 #include <botan/parsing.h>
15 #include <sys/resource.h>
25 bool Unix_Program_Cmp(
const Unix_Program& a,
const Unix_Program& b)
27 if(a.priority == b.priority)
28 return (a.name_and_args < b.name_and_args);
30 return (a.priority < b.priority);
41 std::vector<Unix_Program> default_sources = get_default_sources();
42 add_sources(&default_sources[0], default_sources.size());
50 sources.insert(sources.end(), srcs, srcs + count);
51 std::sort(sources.begin(), sources.end(), Unix_Program_Cmp);
62 const char* stat_targets[] = {
73 for(
size_t i = 0; stat_targets[i]; i++)
77 if(::stat(stat_targets[i], &statbuf) == 0)
78 accum.
add(&statbuf,
sizeof(statbuf), .005);
81 accum.
add(::getpid(), 0);
82 accum.
add(::getppid(), 0);
83 accum.
add(::getuid(), 0);
84 accum.
add(::getgid(), 0);
85 accum.
add(::getpgrp(), 0);
87 struct ::rusage usage;
88 ::getrusage(RUSAGE_SELF, &usage);
89 accum.
add(usage, .005);
91 ::getrusage(RUSAGE_CHILDREN, &usage);
92 accum.
add(usage, .005);
94 const size_t MINIMAL_WORKING = 16;
98 for(
size_t i = 0; i != sources.size(); i++)
102 size_t got_from_src = 0;
106 size_t got_this_loop = pipe.
read(&io_buffer[0], io_buffer.
size());
107 got_from_src += got_this_loop;
109 accum.
add(&io_buffer[0], got_this_loop, .005);
112 sources[i].working = (got_from_src >= MINIMAL_WORKING) ?
true :
false;
MemoryRegion< byte > & get_io_buffer(size_t size)
void clear_mem(T *ptr, size_t n)
void add(const void *bytes, size_t length, double entropy_bits_per_byte)
size_t read(byte[], size_t)
Unix_EntropySource(const std::vector< std::string > &path)
bool polling_goal_achieved() const
void poll(Entropy_Accumulator &accum)
void add_sources(const Unix_Program[], size_t)