annotate toys/other/shred.c @ 1776:7bf68329eb3b draft default tip

Repository switched to git at https://github.com/landley/toybox
author Rob Landley <rob@landley.net>
date Thu, 09 Apr 2015 02:28:32 -0500
parents 9eebbebbc219
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1598
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
1 /* shred.c - Overwrite a file to securely delete
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
2 *
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
3 * Copyright 2014 Rob Landley <rob@landley.net>
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
4 *
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
5 * No standard
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
6
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
7 USE_SHRED(NEWTOY(shred, "<1zxus#<1n#<1o#<0f", TOYFLAG_USR|TOYFLAG_BIN))
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
8
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
9 config SHRED
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
10 bool "shred"
1735
9eebbebbc219 Implement shred -u and switch to default y in defconfig.
Rob Landley <rob@landley.net>
parents: 1598
diff changeset
11 default y
1598
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
12 help
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
13 usage: shred [-fuz] [-n COUNT] [-s SIZE] FILE...
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
14
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
15 Securely delete a file by overwriting its contents with random data.
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
16
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
17 -f Force (chmod if necessary)
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
18 -n COUNT Random overwrite iterations (default 1)
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
19 -o OFFSET Start at OFFSET
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
20 -s SIZE Use SIZE instead of detecting file size
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
21 -u unlink (actually delete file when done)
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
22 -x Use exact size (default without -s rounds up to next 4k)
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
23 -z zero at end
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
24
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
25 Note: data journaling filesystems render this command useless, you must
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
26 overwrite all free space (fill up disk) to erase old data on those.
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
27 */
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
28
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
29 #define FOR_shred
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
30 #include "toys.h"
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
31
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
32 GLOBALS(
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
33 long offset;
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
34 long iterations;
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
35 long size;
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
36
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
37 int ufd;
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
38 )
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
39
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
40 void shred_main(void)
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
41 {
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
42 char **try;
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
43
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
44 if (!(toys.optflags & FLAG_n)) TT.iterations++;
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
45 TT.ufd = xopen("/dev/urandom", O_RDONLY);
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
46
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
47 // We don't use loopfiles() here because "-" isn't stdin, and want to
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
48 // respond to files we can't open via chmod.
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
49
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
50 for (try = toys.optargs; *try; try++) {
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
51 off_t pos = 0, len = TT.size;
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
52 int fd = open(*try, O_RDWR), iter = 0, throw;
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
53
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
54 // do -f chmod if necessary
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
55 if (fd == -1 && (toys.optflags & FLAG_f)) {
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
56 chmod(*try, 0600);
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
57 fd = open(*try, O_RDWR);
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
58 }
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
59 if (fd == -1) {
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
60 perror_msg("%s", *try);
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
61 continue;
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
62 }
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
63
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
64 // determine length
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
65 if (!len) len = fdlength(fd);
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
66 if (len<1) {
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
67 error_msg("%s: needs -s", *try);
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
68 close(fd);
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
69 continue;
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
70 }
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
71
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
72 // Loop through, writing to this file
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
73 for (;;) {
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
74 // Advance to next -n or -z?
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
75
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
76 if (pos >= len) {
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
77 pos = -1;
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
78 if (++iter == TT.iterations && (toys.optargs && FLAG_z)) {
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
79 memset(toybuf, 0, sizeof(toybuf));
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
80 continue;
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
81 }
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
82 if (iter >= TT.iterations) break;
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
83 }
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
84
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
85 if (pos < TT.offset) {
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
86 if (TT.offset != lseek(fd, TT.offset, SEEK_SET)) {
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
87 perror_msg("%s", *try);
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
88 break;
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
89 }
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
90 pos = TT.offset;
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
91 }
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
92
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
93 // Determine length, read random data if not zeroing, write.
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
94
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
95 throw = sizeof(toybuf);
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
96 if (toys.optflags & FLAG_x)
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
97 if (len-pos < throw) throw = len-pos;
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
98
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
99 if (iter != TT.iterations) xread(TT.ufd, toybuf, throw);
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
100 if (throw != writeall(fd, toybuf, throw)) perror_msg("%s");
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
101 pos += throw;
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
102 }
1735
9eebbebbc219 Implement shred -u and switch to default y in defconfig.
Rob Landley <rob@landley.net>
parents: 1598
diff changeset
103 if (toys.optflags & FLAG_u)
9eebbebbc219 Implement shred -u and switch to default y in defconfig.
Rob Landley <rob@landley.net>
parents: 1598
diff changeset
104 if (unlink(*try)) perror_msg("unlink '%s'", *try);
1598
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
105 }
50daa0da1530 Add shred.
Rob Landley <rob@landley.net>
parents:
diff changeset
106 }