1 /* vi: set sw=4 ts=4: */
3 * Copyright (C) 2017 Denys Vlasenko <vda.linux@googlemail.com>
5 * Licensed under GPLv2, see file LICENSE in this source tree.
11 //config: Overwrite a file to hide its contents, and optionally delete it
13 //applet:IF_SHRED(APPLET(shred, BB_DIR_USR_BIN, BB_SUID_DROP))
15 //kbuild:lib-$(CONFIG_SHRED) += shred.o
17 //usage:#define shred_trivial_usage
19 //usage:#define shred_full_usage "\n\n"
20 //usage: "Overwrite/delete FILEs\n"
21 //usage: "\n -f Chmod to ensure writability"
22 //usage: "\n -n N Overwrite N times (default 3)"
23 //usage: "\n -z Final overwrite with zeros"
24 //usage: "\n -u Remove file"
25 //-x and -v are accepted but have no effect
27 /* shred (GNU coreutils) 8.25:
28 -f, --force change permissions to allow writing if necessary
29 -u truncate and remove file after overwriting
30 -z, --zero add a final overwrite with zeros to hide shredding
31 -n, --iterations=N overwrite N times instead of the default (3)
32 -v, --verbose show progress
33 -x, --exact do not round file sizes up to the next full block; this is the default for non-regular files
34 --random-source=FILE get random bytes from FILE
35 -s, --size=N shred this many bytes (suffixes like K, M, G accepted)
36 --remove[=HOW] like -u but give control on HOW to delete; See below
41 int shred_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
42 int shred_main(int argc UNUSED_PARAM, char **argv)
44 int rand_fd = rand_fd; /* for compiler */
46 unsigned num_iter = 3;
57 opt = getopt32(argv, "fuzn:+vx", &num_iter);
60 zero_fd = xopen("/dev/zero", O_RDONLY);
62 rand_fd = xopen("/dev/urandom", O_RDONLY);
78 fd = open(fname, O_WRONLY);
83 fd = xopen(fname, O_WRONLY);
85 if (fstat(fd, &sb) == 0 && sb.st_size > 0) {
86 off_t size = sb.st_size;
88 for (i = 0; i < num_iter; i++) {
89 bb_copyfd_size(rand_fd, fd, size);
91 xlseek(fd, 0, SEEK_SET);
94 bb_copyfd_size(zero_fd, fd, size);