| /* |
| * Bulkstat test case from Roger Willcocks <willcor@gmail.com> |
| */ |
| #include <sys/types.h> |
| #include <unistd.h> |
| #include <stdlib.h> |
| #include <stdio.h> |
| #include <fcntl.h> |
| |
| char buffer[32768]; |
| int overwrote; |
| |
| void die(char *func) |
| { |
| perror(func); |
| exit(1); |
| } |
| |
| void nuke() |
| { |
| int i; |
| for (i = 2048; i < 32768-1; i++) |
| if (buffer[i] == 'I' && buffer[i+1] == 'N') { |
| buffer[i] = buffer[i+1] = 'X'; |
| overwrote = 1; |
| } |
| } |
| |
| int main(int argc, char* argv[]) |
| { |
| int f; |
| loff_t offset; |
| |
| if (argc != 3) { |
| printf("%s <device> <offset>\n", argv[0]); |
| exit(1); |
| } |
| |
| f = open(argv[1], O_RDWR); |
| offset = atoll(argv[2]); |
| |
| if (f < 0) die("open"); |
| if (lseek(f, offset, SEEK_SET) < 0) die("lseek"); |
| if (read(f, buffer, 32768) != 32768) die("read"); |
| printf("Starting overwrite\n"); |
| nuke(); |
| if (lseek(f, offset, SEEK_SET) < 0) die("lseek"); |
| if (write(f, buffer, 32768) != 32768) die("write"); |
| if (!overwrote) |
| printf("Did not overwrite any inodes\n"); |
| printf("Overwrite complete\n"); |
| close(f); |
| return 0; |
| } |