Whamcloud - gitweb
branch: HEAD
[fs/lustre-release.git] / lustre / tests / createtest.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <sys/types.h>
4 #include <sys/stat.h>
5 #include <fcntl.h>
6 #include <unistd.h>
7 #include <errno.h>
8 #include <string.h>
9
10 #ifndef S_SHIFT
11 #define S_SHIFT 12
12 #endif
13
14 int usage(char *prog)
15 {
16         fprintf(stderr, "usage: %s <basename>\n", prog);
17         exit(1);
18 }
19
20 int main(int argc, char *argv[])
21 {
22         char name[4096];
23         int i;
24
25         if (argc != 2)
26                 usage(argv[0]);
27
28         umask(0);
29         for (i = 0; i <= S_IFMT; i += (1 << S_SHIFT)) {
30                 struct stat st;
31                 int mode = i | 0644;
32                 int rc;
33
34                 sprintf(name, "%s-mknod%06o", argv[1], mode);
35                 rc = mknod(name, mode, 0x1234);
36                 switch (i) {
37                 case 0:
38                         mode |= S_IFREG;
39                 case S_IFREG:
40                 case S_IFCHR: case S_IFBLK:
41                         if (rc < 0 && getuid() != 0)
42                                 continue;
43                 case S_IFSOCK: case S_IFIFO:
44                         if (rc < 0) {
45                                 fprintf(stderr, "%s: ERROR mknod %s: %s\n",
46                                         argv[0], name, strerror(errno));
47                                 exit(10);
48                         }
49                         rc = stat(name, &st);
50                         if (rc < 0) {
51                                 fprintf(stderr, "%s: ERROR stat %s: %s",
52                                         argv[0], name, strerror(errno));
53                                 exit(11);
54                         }
55                         if (st.st_mode != mode) {
56                                 fprintf(stderr, "%s: ERROR mode %s: %o != %o",
57                                         argv[0], name, st.st_mode, mode);
58                                 exit(12);
59                         }
60                         rc = unlink(name);
61                         if (rc < 0) {
62                                 fprintf(stderr, "%s: ERROR unlink %s: %s",
63                                         argv[0], name, strerror(errno));
64                                 exit(13);
65                         }
66                         break;
67                 default:
68                         if (rc == 0) {
69                                 fprintf(stderr, "%s: ERROR: %s created\n",
70                                         argv[0], name);
71                                 exit(14);
72                         }
73                 }
74         }
75
76         for (i = 0; i <= S_IFMT; i += (1 << S_SHIFT)) {
77                 struct stat st;
78                 int mode;
79                 int fd;
80                 int rc;
81
82                 mode = i | 0644;
83                 sprintf(name, "%s-creat%06o", argv[1], mode);
84                 fd = open(name, O_CREAT|O_RDONLY, mode);
85                 if (fd < 0) {
86                         fprintf(stderr, "%s: ERROR creat %s: %s\n",
87                                 argv[0], name, strerror(errno));
88                         exit(21);
89                 }
90                 close(fd);
91                 rc = stat(name, &st);
92                 if (rc < 0) {
93                         fprintf(stderr, "%s: ERROR stat %s: %s",
94                                 argv[0], name, strerror(errno));
95                         exit(11);
96                 }
97                 if (!S_ISREG(st.st_mode & S_IFMT)) {
98                         fprintf(stderr, "%s: ERROR mode %s: %o != %o",
99                                 argv[0], name, st.st_mode & S_IFMT, S_IFREG);
100                         exit(12);
101                 }
102                 rc = unlink(name);
103                 if (rc < 0) {
104                         fprintf(stderr, "%s: ERROR unlink %s: %s\n",
105                                 argv[0], name, strerror(errno));
106                         exit(20);
107                 }
108         }
109
110         for (i = 0; i <= S_IFMT; i += (1 << S_SHIFT)) {
111                 struct stat st;
112                 int rc;
113
114                 sprintf(name, "%s-mkdir%06o", argv[1], i | 0644);
115                 rc = mkdir(name, i | 0664);
116                 if (rc < 0) {
117                         fprintf(stderr, "%s: ERROR mkdir %s: %s\n",
118                                 argv[0], name, strerror(errno));
119                         exit(30);
120                 }
121                 rc = stat(name, &st);
122                 if (rc < 0) {
123                         fprintf(stderr, "%s: ERROR stat %s: %s",
124                                 argv[0], name, strerror(errno));
125                         exit(11);
126                 }
127                 if (!S_ISDIR(st.st_mode)) {
128                         fprintf(stderr, "%s: ERROR mode %s: %o != %o",
129                                 argv[0], name, st.st_mode & S_IFMT, S_IFDIR);
130                         exit(12);
131                 }
132                 rc = rmdir(name);
133                 if (rc < 0) {
134                         fprintf(stderr, "%s: ERROR rmdir %s: %s\n",
135                                 argv[0], name, strerror(errno));
136                         exit(31);
137                 }
138         }
139
140         printf("%s: SUCCESS\n", argv[0]);
141         return 0;
142 }