aboutsummaryrefslogtreecommitdiffstats
path: root/deadshred.c
diff options
context:
space:
mode:
Diffstat (limited to 'deadshred.c')
-rw-r--r--deadshred.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/deadshred.c b/deadshred.c
index 5323d15..5f8f36b 100644
--- a/deadshred.c
+++ b/deadshred.c
@@ -4,7 +4,7 @@
#include <libsimple-arg.h>
-USAGE("file");
+USAGE("device [< random-source]");
struct span {
@@ -23,6 +23,7 @@ static off_t total_size = 0;
static char reservoir[128U << 10];
static size_t reservoir_off = sizeof(reservoir);
+static int use_stdin;
static char total_size_1000[256];
static char total_size_1024[256];
@@ -60,6 +61,12 @@ ensure_random(size_t needed)
if (sizeof(reservoir) - reservoir_off >= needed)
return;
+ if (!use_stdin) {
+ libsimple_random_bytes(&libsimple_random_bits, NULL, reservoir, reservoir_off);
+ reservoir_off = 0;
+ return;
+ }
+
for (off = 0; off < reservoir_off;) {
r = read(STDIN_FILENO, &reservoir[off], reservoir_off - off);
if (r <= 0) {
@@ -206,6 +213,11 @@ main(int argc, char *argv[])
if (fd < 0)
eprintf("open %s O_WRONLY:", argv[0]);
+ use_stdin = !isatty(STDIN_FILENO);
+ if (!use_stdin) {
+ libsimple_srand();
+ }
+
spans = emalloc(sizeof(*spans));
spans[0].start = 0;
spans[0].end = total_size = filesize(fd, argv[0]);