add netbsd nl(1)
[rofl0r-hardcore-utils.git] / shred.c
blob4f3be4e8f0a3d76e14b77d483e140ef2931c476d
1 #include <fcntl.h>
2 #include <unistd.h>
3 #include <stdio.h>
4 #include <sys/stat.h>
6 static int urandfd;
8 static off_t getfs(int fd) {
9 struct stat st;
10 if (fstat(fd, &st) != -1)
11 return st.st_size;
12 return (off_t)-1;
15 static int shred(char *fn) {
16 int fd, ret = 1;
17 off_t fs, curr = 0;
18 unsigned char buf[16384];
19 if((fd = open(fn, O_RDWR)) == -1) {
20 perror(fn);
21 return 1;
23 if((fs = getfs(fd)) == (off_t)-1) {
24 fputs(fn, stderr);
25 perror(": failed to get filesize");
26 goto out;
28 ret = 0;
29 while(curr < fs) {
30 off_t left = fs - curr;
31 if(left > 16384) left = 16384;
32 read(urandfd, buf, left);
33 if(left != write(fd, buf, left)) ret = 1;
34 curr += left;
36 out:
37 close(fd);
38 return ret;
42 static int usage() {
43 fputs(
44 "shred FILE1 [FILE2...]\n\n"
45 "overwrites contents of FILEs with random garbage\n"
46 , stderr
48 return 1;
51 int main(int argc, char **argv) {
52 if(argc < 2) return usage();
53 if((urandfd = open("/dev/urandom", O_RDONLY)) == -1) {
54 perror("failed to open /dev/urandom");
55 return 1;
57 int i, f = 0;
58 for(i=1; i<argc; ++i) {
59 f += shred(argv[i]);
61 close(urandfd);
62 return f;