9 #define T1 "write before unlink\n"
10 #define T2 "write after unlink\n"
13 int main(int argc, char **argv)
18 if (argc < 2 || argc > 3) {
19 fprintf(stderr, "usage: %s filename [filename2]\n", argv[0]);
29 fprintf(stderr, "opening\n");
30 fd = open(fname, O_RDWR | O_TRUNC | O_CREAT, 0644);
32 fprintf(stderr, "open (normal) %s\n", strerror(errno));
36 fprintf(stderr, "writing\n");
37 rc = write(fd, T1, strlen(T1) + 1);
38 if (rc != strlen(T1) + 1) {
39 fprintf(stderr, "write (normal) %s\n", strerror(errno));
44 fprintf(stderr, "closing %s\n", fname);
47 fprintf(stderr, "close (normal) %s\n", strerror(errno));
51 fprintf(stderr, "opening %s\n", fname2);
52 fd = open(fname2, O_RDWR);
54 fprintf(stderr, "open (unlink) %s\n", strerror(errno));
58 fprintf (stderr, "unlinking %s\n", fname2);
61 fprintf(stderr, "unlink %s\n", strerror(errno));
65 if (access(fname2, F_OK) == 0) {
66 fprintf(stderr, "%s still exists\n", fname2);
70 printf("unlink %s and press enter\n", fname);
74 if (access(fname, F_OK) == 0) {
75 fprintf(stderr, "%s still exists\n", fname);
79 fprintf(stderr, "reading\n");
80 rc = read(fd, buf, strlen(T1) + 1);
81 if (rc != strlen(T1) + 1) {
82 fprintf(stderr, "read (unlink) %s rc %d\n",
87 fprintf(stderr, "comparing data\n");
88 if (memcmp(buf, T1, strlen(T1) + 1) ) {
89 fprintf(stderr, "FAILURE: read wrong data after unlink\n");
93 fprintf(stderr, "truncating\n");
94 rc = ftruncate(fd, 0);
96 fprintf(stderr, "truncate (unlink) %s\n", strerror(errno));
100 fprintf(stderr, "seeking\n");
101 rc = lseek(fd, 0, SEEK_SET);
103 fprintf(stderr, "seek (after unlink trunc) %s\n",
108 fprintf(stderr, "writing again\n");
109 rc = write(fd, T2, strlen(T2) + 1);
110 if (rc != strlen(T2) + 1) {
111 fprintf(stderr, "write (after unlink trunc) %s (rc %d)\n",
112 strerror(errno), rc);
116 fprintf(stderr, "seeking\n");
117 rc = lseek(fd, 0, SEEK_SET);
119 fprintf(stderr, "seek (before unlink read) %s\n",
124 fprintf(stderr, "reading again\n");
125 rc = read(fd, buf, strlen(T2) + 1);
126 if (rc != strlen(T2) + 1) {
127 fprintf(stderr, "read (after unlink rewrite) %s\n",
132 fprintf(stderr, "comparing data again\n");
133 if (memcmp(buf, T2, strlen(T2) + 1)) {
134 fprintf(stderr, "FAILURE: read wrong data after rewrite\n");
138 fprintf(stderr, "closing again\n");
141 fprintf(stderr, "close (unlink) %s\n", strerror(errno));
145 fprintf(stderr, "SUCCESS - goto beer\n");