Whamcloud - gitweb
Merge b_md into HEAD
[fs/lustre-release.git] / lustre / tests / openunlink.c
1 #include <stdio.h>
2 #include <fcntl.h>
3 #include <string.h>
4 #include <errno.h>
5 #include <sys/types.h>
6 #include <stdlib.h>
7 #include <unistd.h>
8
9 #define T1 "write before unlink\n"
10 #define T2 "write after unlink\n"
11 char buf[128];
12
13 int main(int argc, char **argv)
14 {
15         char *fname, *fname2;
16         int fd, rc;
17
18         if (argc < 2 || argc > 3) {
19                 fprintf(stderr, "usage: %s filename [filename2]\n", argv[0]);
20                 exit(1);
21         }
22
23         fname = argv[1];
24         if (argc == 3)
25                 fname2 = argv[2];
26         else
27                 fname2 = argv[1];
28
29         fprintf(stderr, "opening\n");
30         fd = open(fname, O_RDWR | O_TRUNC | O_CREAT, 0644);
31         if (fd == -1) {
32                 fprintf(stderr, "open (normal) %s\n", strerror(errno));
33                 exit(1);
34         }
35
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));
40                 exit(1);
41         }
42
43         if (argc == 3) {
44                 fprintf(stderr, "closing %s\n", fname);
45                 rc = close(fd);
46                 if (rc) {
47                         fprintf(stderr, "close (normal) %s\n", strerror(errno));
48                         exit(1);
49                 }
50
51                 fprintf(stderr, "opening %s\n", fname2);
52                 fd = open(fname2, O_RDWR);
53                 if (fd == -1) {
54                         fprintf(stderr, "open (unlink) %s\n", strerror(errno));
55                         exit(1);
56                 }
57
58                 fprintf (stderr, "unlinking %s\n", fname2);
59                 rc = unlink(fname2);
60                 if (rc) {
61                         fprintf(stderr, "unlink %s\n", strerror(errno));
62                         exit(1);
63                 }
64
65                 if (access(fname2, F_OK) == 0) {
66                         fprintf(stderr, "%s still exists\n", fname2);
67                         exit(1);
68                 }
69         } else {
70                 printf("unlink %s and press enter\n", fname);
71                 getc(stdin);
72         }
73
74         if (access(fname, F_OK) == 0) {
75                 fprintf(stderr, "%s still exists\n", fname);
76                 exit(1);
77         }
78
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",
83                         strerror(errno), rc);
84                 exit(1);
85         }
86
87         fprintf(stderr, "comparing data\n");
88         if (memcmp(buf, T1, strlen(T1) + 1) ) {
89                 fprintf(stderr, "FAILURE: read wrong data after unlink\n");
90                 exit(1);
91         }
92
93         fprintf(stderr, "truncating\n");
94         rc = ftruncate(fd, 0);
95         if (rc ) {
96                 fprintf(stderr, "truncate (unlink) %s\n", strerror(errno));
97                 exit(1);
98         }
99
100         fprintf(stderr, "seeking\n");
101         rc = lseek(fd, 0, SEEK_SET);
102         if (rc) {
103                 fprintf(stderr, "seek (after unlink trunc) %s\n",
104                         strerror(errno));
105                 exit(1);
106         }
107
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);
113                 exit(1);
114         }
115
116         fprintf(stderr, "seeking\n");
117         rc = lseek(fd, 0, SEEK_SET);
118         if (rc) {
119                 fprintf(stderr, "seek (before unlink read) %s\n",
120                         strerror(errno));
121                 exit(1);
122         }
123
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",
128                         strerror(errno));
129                 exit(1);
130         }
131
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");
135                 exit(1);
136         }
137
138         fprintf(stderr, "closing again\n");
139         rc = close(fd);
140         if (rc) {
141                 fprintf(stderr, "close (unlink) %s\n", strerror(errno));
142                 exit(1);
143         }
144
145         fprintf(stderr, "SUCCESS - goto beer\n");
146         return 0;
147 }