#include #include #include #include #include #include #include #include int main(int argc, char *argv[]) { int fin; struct stat st; if (argc != 2) { fprintf(stderr, "Usage: %s \n", argv[0]); return 1; } fin = open(argv[1], O_RDWR); assert(fin >= 0); fstat(fin, &st); if (st.st_nlink > 1) { unlink(argv[1]); close(fin); return 0; } char *src = mmap(NULL, st.st_size, PROT_WRITE, MAP_SHARED, fin, 0); assert(src != MAP_FAILED); memset(src, 0xff, st.st_size); munmap(src, st.st_size); src = mmap(NULL, st.st_size, PROT_WRITE, MAP_SHARED, fin, 0); assert(src != MAP_FAILED); int urandom = open("/dev/urandom", O_RDONLY); assert(urandom >= 0); ssize_t r = read(urandom, src, st.st_size); assert(r == st.st_size); munmap(src, st.st_size); char new_name[64]; r = read(urandom, new_name, sizeof(new_name)); assert(r == sizeof(new_name)); close(urandom); close(fin); rename(argv[1], new_name); remove(new_name); }