aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2021-06-20 13:08:50 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2021-06-20 13:08:50 +0200
commitec3170ac9578d4a42423e5a966a8ba668df68337 (patch)
tree33c96188abf62b845fdfea797b720a2aa8b5140a
parent83dff7f43154cd41e4d2e5831060a2d2ddc6596e (diff)
downloadbusybox-w32-ec3170ac9578d4a42423e5a966a8ba668df68337.tar.gz
busybox-w32-ec3170ac9578d4a42423e5a966a8ba668df68337.tar.bz2
busybox-w32-ec3170ac9578d4a42423e5a966a8ba668df68337.zip
shred: implement -s SIZE
function old new delta shred_main 337 391 +54 .rodata 103393 103395 +2 packed_usage 33666 33656 -10 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 2/1 up/down: 56/-10) Total: 46 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--coreutils/shred.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/coreutils/shred.c b/coreutils/shred.c
index 69fb3e8cc..4b95d197c 100644
--- a/coreutils/shred.c
+++ b/coreutils/shred.c
@@ -15,14 +15,15 @@
15//kbuild:lib-$(CONFIG_SHRED) += shred.o 15//kbuild:lib-$(CONFIG_SHRED) += shred.o
16 16
17//usage:#define shred_trivial_usage 17//usage:#define shred_trivial_usage
18//usage: "[-fuz] [-n N] FILE..." 18//usage: "[-fuz] [-n N] [-s SIZE] FILE..."
19//usage:#define shred_full_usage "\n\n" 19//usage:#define shred_full_usage "\n\n"
20//usage: "Overwrite/delete FILEs\n" 20//usage: "Overwrite/delete FILEs\n"
21//usage: "\n -f Chmod to ensure writability" 21//usage: "\n -f Chmod to ensure writability"
22//usage: "\n -s SIZE Size to write"
22//usage: "\n -n N Overwrite N times (default 3)" 23//usage: "\n -n N Overwrite N times (default 3)"
23//usage: "\n -z Final overwrite with zeros" 24//usage: "\n -z Final overwrite with zeros"
24//usage: "\n -u Remove file" 25//usage: "\n -u Remove file"
25//-x and -v are accepted but have no effect 26//-x (exact: don't round up to 4k) and -v (verbose) are accepted but have no effect
26 27
27/* shred (GNU coreutils) 8.25: 28/* shred (GNU coreutils) 8.25:
28-f, --force change permissions to allow writing if necessary 29-f, --force change permissions to allow writing if necessary
@@ -41,6 +42,7 @@
41int shred_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 42int shred_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
42int shred_main(int argc UNUSED_PARAM, char **argv) 43int shred_main(int argc UNUSED_PARAM, char **argv)
43{ 44{
45 char *opt_s;
44 int rand_fd = rand_fd; /* for compiler */ 46 int rand_fd = rand_fd; /* for compiler */
45 int zero_fd; 47 int zero_fd;
46 unsigned num_iter = 3; 48 unsigned num_iter = 3;
@@ -52,9 +54,10 @@ int shred_main(int argc UNUSED_PARAM, char **argv)
52 OPT_n = (1 << 3), 54 OPT_n = (1 << 3),
53 OPT_v = (1 << 4), 55 OPT_v = (1 << 4),
54 OPT_x = (1 << 5), 56 OPT_x = (1 << 5),
57 OPT_s = (1 << 6),
55 }; 58 };
56 59
57 opt = getopt32(argv, "^" "fuzn:+vx" "\0" "-1"/*min 1 arg*/, &num_iter); 60 opt = getopt32(argv, "^" "fuzn:+vxs:" "\0" "-1"/*min 1 arg*/, &num_iter, &opt_s);
58 argv += optind; 61 argv += optind;
59 62
60 zero_fd = xopen("/dev/zero", O_RDONLY); 63 zero_fd = xopen("/dev/zero", O_RDONLY);
@@ -82,6 +85,11 @@ int shred_main(int argc UNUSED_PARAM, char **argv)
82 if (fstat(fd, &sb) == 0 && sb.st_size > 0) { 85 if (fstat(fd, &sb) == 0 && sb.st_size > 0) {
83 off_t size = sb.st_size; 86 off_t size = sb.st_size;
84 87
88 if (opt & OPT_s) {
89 size = BB_STRTOOFF(opt_s, NULL, 0); /* accepts oct/hex */
90 if (errno || size < 0) bb_show_usage();
91 }
92
85 for (i = 0; i < num_iter; i++) { 93 for (i = 0; i < num_iter; i++) {
86 bb_copyfd_size(rand_fd, fd, size); 94 bb_copyfd_size(rand_fd, fd, size);
87 fdatasync(fd); 95 fdatasync(fd);