Whamcloud - gitweb
land v0.9.1 on HEAD, in preparation for a 1.0.x branch
[fs/lustre-release.git] / lustre / tests / multiop.c
1 #include <stdio.h>
2 #include <fcntl.h>
3 #include <string.h>
4 #include <errno.h>
5 #include <sys/types.h>
6 #include <sys/stat.h>
7 #include <sys/mman.h>
8 #include <signal.h>
9 #include <stdlib.h>
10 #include <unistd.h>
11
12 #define T1 "write data before unlink\n"
13 #define T2 "write data after unlink\n"
14 char buf[128];
15
16 char usage[] = 
17 "Usage: %s filename command-sequence\n"
18 "    command-sequence items:\n"
19 "        d  mkdir\n"
20 "        o  open(O_RDONLY)\n"
21 "        O  open(O_CREAT|O_RDWR)\n"
22 "        u  unlink\n"
23 "        U  munmap\n"
24 "        m  mknod\n"
25 "        M  rw mmap to EOF (must open and stat prior)\n"
26 "        c  close\n"
27 "        _  wait for signal\n"
28 "        R  reference entire mmap-ed region\n"
29 "        r  read\n"
30 "        s  stat\n"
31 "        S  fstat\n"
32 "        t  fchmod\n"
33 "        T  ftruncate to zero\n"
34 "        w  write\n"
35 "        W  write entire mmap-ed region\n"
36 "        y  fsync\n"
37 "        Y  fdatasync\n"
38 "        z  seek to zero\n";
39
40 void null_handler(int unused) { }
41
42 int main(int argc, char **argv)
43 {
44         char *fname, *commands;
45         struct stat st;
46         size_t mmap_len, i;
47         unsigned char *mmap_ptr = NULL, junk = 0;
48         int fd = -1;
49
50         if (argc != 3) {
51                 fprintf(stderr, usage, argv[0]);
52                 exit(1);
53         }
54
55         signal(SIGUSR1, null_handler);
56
57         fname = argv[1];
58
59         for (commands = argv[2]; *commands; commands++) {
60                 switch (*commands) {
61                 case '_':
62                         pause();
63                         break;
64                 case 'c':
65                         if (close(fd) == -1) {
66                                 perror("close");
67                                 exit(1);
68                         }
69                         fd = -1;
70                         break;
71                 case 'd':
72                         if (mkdir(fname, 0755) == -1) {
73                                 perror("mkdir(0755)");
74                                 exit(1);
75                         }
76                         break;
77                 case 'm':
78                         if (mknod(fname, S_IFREG | 0644, 0) == -1) {
79                                 perror("mknod(S_IFREG|0644, 0)");
80                                 exit(1);
81                         }
82                         break;
83                 case 'M':
84                         mmap_len = st.st_size;
85                         mmap_ptr = mmap(NULL, mmap_len, PROT_WRITE | PROT_READ,
86                                         MAP_SHARED, fd, 0);
87                         if (mmap_ptr == MAP_FAILED) {
88                                 perror("mmap");
89                                 exit(1);
90                         }
91                         break;
92                 case 'O':
93                         fd = open(fname, O_CREAT|O_RDWR, 0644);
94                         if (fd == -1) {
95                                 perror("open(O_RDWR|O_CREAT)");
96                                 exit(1);
97                         }
98                         break;
99                 case 'o':
100                         fd = open(fname, O_RDONLY);
101                         if (fd == -1) {
102                                 perror("open(O_RDONLY)");
103                                 exit(1);
104                         }
105                         break;
106                 case 'r': {
107                         char buf;
108                         if (read(fd, &buf, 1) == -1) {
109                                 perror("read");
110                                 exit(1);
111                         }
112                 }
113                 case 'S':
114                         if (fstat(fd, &st) == -1) {
115                                 perror("fstat");
116                                 exit(1);
117                         }
118                         break;
119                 case 'R':
120                         for (i = 0; i < mmap_len && mmap_ptr; i += 4096)
121                                 junk += mmap_ptr[i];
122                         break;
123                 case 's':
124                         if (stat(fname, &st) == -1) {
125                                 perror("stat");
126                                 exit(1);
127                         }
128                         break;
129                 case 't':
130                         if (fchmod(fd, 0) == -1) {
131                                 perror("fchmod");
132                                 exit(1);
133                         }
134                         break;
135                 case 'T':
136                         if (ftruncate(fd, 0) == -1) {
137                                 perror("ftruncate");
138                                 exit(1);
139                         }
140                         break;
141                 case 'u':
142                         if (unlink(fname) == -1) {
143                                 perror("unlink");
144                                 exit(1);
145                         }
146                         break;
147                 case 'U':
148                         if (munmap(mmap_ptr, mmap_len)) {
149                                 perror("munmap");
150                                 exit(1);
151                         }
152                         break;
153                 case 'w':
154                         if (write(fd, "w", 1) == -1) {
155                                 perror("write");
156                                 exit(1);
157                         }
158                         break;
159                 case 'W':
160                         for (i = 0; i < mmap_len && mmap_ptr; i += 4096)
161                                 mmap_ptr[i] += junk++;
162                         break;
163                 case 'y':
164                         if (fsync(fd) == -1) {
165                                 perror("fsync");
166                                 exit(1);
167                         }
168                         break;
169                 case 'Y':
170                         if (fdatasync(fd) == -1) {
171                                 perror("fdatasync");
172                                 exit(1);
173                         }
174                 case 'z':
175                         if (lseek(fd, 0, SEEK_SET) == -1) {
176                                 perror("lseek");
177                                 exit(1);
178                         }
179                         break;
180                 default:
181                         fprintf(stderr, "unknown command \"%c\"\n", *commands);
182                         fprintf(stderr, usage, argv[0]);
183                         exit(1);
184                 }
185         }
186
187         return 0;
188 }