DF-3004 / df3004b.c
#include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <sys/stat.h> int main(int argc, char **argv){ struct stat st; int fd = open(argv[1], O_RDONLY); if (fd < 0) { perror("open"); return 1; } if (fstat(fd, &st) == 0) printf("before unlink: nlink=%llu size=%lld\n", (unsigned long long)st.st_nlink, (long long)st.st_size); if (unlink(argv[1]) < 0) perror("unlink"); if (fstat(fd, &st) == 0) printf("after unlink: nlink=%llu <-- crafted nlinks=0 wrapped\n", (unsigned long long)st.st_nlink); sleep(3); /* let flusher run while we hold the fd */ if (fstat(fd, &st) == 0) printf("after 3s flush pause: nlink=%llu\n", (unsigned long long)st.st_nlink); close(fd); return 0; } |