diff options
Diffstat (limited to '')
-rw-r--r-- | README | 7 | ||||
-rw-r--r-- | TODO | 1 | ||||
-rw-r--r-- | config.mk | 1 | ||||
-rw-r--r-- | deadshred.1 | 9 | ||||
-rw-r--r-- | deadshred.c | 14 |
5 files changed, 23 insertions, 9 deletions
@@ -2,7 +2,7 @@ NAME deadshred - override the contents of a device that may be broken SYNOPSIS - deadshred device < random-source + deadshred device [< random-source] DESCRIPTION The deadshred utility fills a file or block devices with @@ -22,8 +22,9 @@ OPERANDS a block device. STDIN - The standard input shall be an unless source of either random - data or a particular byte to fill the device with. + Unless the standard input is a terminal device, it shall be an + unless source of either random data or a particular byte to + fill the device with. NOTES While the deadshred utility is designed for block devices, it @@ -1,6 +1,5 @@ Add `-n iterations` Add shred map for continuing later (print to stdout on SIGTERM) -Use rand(3) if stdin is a TTY Enhance progress printout with: exact bytes count @@ -6,3 +6,4 @@ CC = c99 CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700 -D_GNU_SOURCE CFLAGS = LDFLAGS = -lsimple +#libsimple>=1.7 diff --git a/deadshred.1 b/deadshred.1 index eb321d5..be586b2 100644 --- a/deadshred.1 +++ b/deadshred.1 @@ -5,8 +5,8 @@ deadshred \- override the contents of a device that may be broken .SH SYNOPSIS .B deadshred .I device -< -.I random-source +[< +.IR random-source ] .SH DESCRIPTION The @@ -30,8 +30,9 @@ The file to override. Must be either a regular file or a block device. .SH STDIN -The standard input shall be an unless source of either random -data or a particular byte to fill the device with. +Unless the standard input is a terminal device, it shall be an +unless source of either random data or a particular byte to +fill the device with. .SH NOTES While the 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]); |