8a6f5e881b38107d81bc24fe3546a0d09529cd16
[tridge/dbench.git] / dbench.h
1 /* 
2    dbench version 2
3    Copyright (C) Andrew Tridgell 1999
4    
5    This program is free software; you can redistribute it and/or modify
6    it under the terms of the GNU General Public License as published by
7    the Free Software Foundation; either version 3 of the License, or
8    (at your option) any later version.
9    
10    This program is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13    GNU General Public License for more details.
14    
15    You should have received a copy of the GNU General Public License
16    along with this program; if not, see <http://www.gnu.org/licenses/>.
17 */
18
19 #include "config.h"
20 #include <stdio.h>
21 #include <stdlib.h>
22 #include <stddef.h>
23 #include <signal.h>
24 #include <unistd.h>
25 #include <string.h>
26 #include <ctype.h>
27 #include <dirent.h>
28 #include <sys/stat.h>
29 #include <sys/time.h>
30 #include <sys/wait.h>
31 #include <sys/types.h>
32 #include <sys/socket.h>
33 #include <fcntl.h>
34 #include <time.h>
35 #include <sys/ipc.h>
36 #include <sys/shm.h>
37 #include <sys/mman.h>
38
39 #ifdef HAVE_SYS_VFS_H
40 #include <sys/vfs.h>
41 #endif
42
43 #ifdef HAVE_SYS_STATVFS_H
44 #include <sys/statvfs.h>
45 #endif
46
47 #include <sys/param.h>
48 #ifdef HAVE_SYS_MOUNT_H
49 #include <sys/mount.h>
50 #endif
51 #include <utime.h>
52 #include <errno.h>
53 #include <strings.h>
54 #ifdef HAVE_STDINT_H
55 #include <stdint.h>
56 #endif
57 #include <netinet/in.h>
58 #include <netinet/tcp.h>
59 #include <netdb.h>
60
61 #if HAVE_ATTR_XATTR_H
62 #include <attr/xattr.h>
63 #elif HAVE_SYS_XATTR_H
64 #include <sys/xattr.h>
65 #elif HAVE_SYS_ATTRIBUTES_H
66 #include <sys/attributes.h>
67 #endif
68
69 #ifdef HAVE_SYS_EXTATTR_H
70 #include <sys/extattr.h>
71 #endif
72
73 #ifdef HAVE_SYS_UIO_H
74 #include <sys/uio.h>
75 #endif
76
77 #ifndef MSG_WAITALL
78 #define MSG_WAITALL 0x100
79 #endif
80
81 #define PRINT_FREQ 1
82
83 #ifndef MIN
84 #define MIN(x,y) ((x)<(y)?(x):(y))
85 #endif
86
87 #define TCP_PORT 7003
88 #define TCP_OPTIONS "TCP_NODELAY SO_REUSEADDR"
89
90 #define BOOL int
91 #define True 1
92 #define False 0
93 #define uint32 unsigned
94
95 struct op {
96         unsigned count;
97         double total_time;
98         double max_latency;
99 };
100
101 struct child_struct {
102         int id;
103         int failed;
104         int line;
105         int done;
106         int cleanup;
107         int cleanup_finished;
108         const char *directory;
109         double bytes;
110         double bytes_done_warmup;
111         double max_latency;
112         double worst_latency;
113         struct timeval starttime;
114         struct timeval lasttime;
115         off_t bytes_since_fsync;
116         char *cname;
117         struct {
118                 double last_bytes;
119                 struct timeval last_time;
120         } rate;
121         struct opnames {
122                 struct op op_NTCreateX;
123                 struct op op_Close;
124                 struct op op_Rename;
125                 struct op op_Unlink;
126                 struct op op_Deltree;
127                 struct op op_Rmdir;
128                 struct op op_Mkdir;
129                 struct op op_Qpathinfo;
130                 struct op op_Qfileinfo;
131                 struct op op_Qfsinfo;
132                 struct op op_Sfileinfo;
133                 struct op op_Find;
134                 struct op op_WriteX;
135                 struct op op_ReadX;
136                 struct op op_LockX;
137                 struct op op_UnlockX;
138                 struct op op_Flush;
139                 struct op op_GETATTR3;
140                 struct op op_MKDIR3;
141                 struct op op_RMDIR3;
142                 struct op op_LOOKUP3;
143                 struct op op_CREATE3;
144                 struct op op_WRITE3;
145                 struct op op_COMMIT3;
146                 struct op op_READ3;
147                 struct op op_ACCESS3;
148                 struct op op_FSSTAT3;
149                 struct op op_FSINFO3;
150                 struct op op_SYMLINK3;
151                 struct op op_REMOVE3;
152                 struct op op_READDIRPLUS3;
153                 struct op op_LINK3;
154         } op;
155         void *private;
156 };
157
158 struct options {
159         int nprocs;
160         int sync_open;
161         int sync_dirs;
162         int do_fsync;
163         int no_resolve;
164         int fsync_frequency;
165         char *tcp_options;
166         int timelimit;
167         int warmup;
168         const char *directory;
169         char *loadfile;
170         double targetrate;
171         int ea_enable;
172         const char *server;
173         int clients_per_process;
174         int one_byte_write_fix;
175         int stat_check;
176         int fake_io;
177         int skip_cleanup;
178         int per_client_results;
179         const char *export;
180         const char *protocol;
181 };
182
183 struct nb_operations {
184         void (*setup)(struct child_struct *);
185         void (*deltree)(struct child_struct *, const char *dname);
186         void (*cleanup)(struct child_struct *child);
187
188         /* CIFS operations */
189         void (*flush)(struct child_struct *, int handle, const char *status);
190         void (*close)(struct child_struct *, int handle, const char *status);
191         void (*lockx)(struct child_struct *, int handle, uint32_t offset, int size, const char *status);
192         void (*rmdir)(struct child_struct *, const char *fname, const char *status);
193         void (*mkdir)(struct child_struct *, const char *dname, const char *status);
194         void (*rename)(struct child_struct *, const char *old, const char *new, const char *status);
195         void (*readx)(struct child_struct *, int handle, int offset, int size, int ret_size, const char *status);
196         void (*writex)(struct child_struct *, int handle, int offset, int size, int ret_size, const char *status);
197         void (*unlink)(struct child_struct *, const char *fname, int attr, const char *status);
198         void (*unlockx)(struct child_struct *child,int handle, uint32_t offset, int size, const char *status);
199         void (*findfirst)(struct child_struct *child, const char *fname, int level, int maxcnt, int count, const char *status);
200         void (*sfileinfo)(struct child_struct *child, int handle, int level, const char *status);
201         void (*qfileinfo)(struct child_struct *child, int handle, int level, const char *status);
202         void (*qpathinfo)(struct child_struct *child, const char *fname, int level, const char *status);
203         void (*qfsinfo)(struct child_struct *child, int level, const char *status);
204         void (*createx)(struct child_struct *child, const char *fname, uint32_t create_options, uint32_t create_disposition, int fnum, const char *status);
205
206         /* NFSv3 operations */
207         void (*getattr3)(struct child_struct *child, const char *fname, const char *status);
208         void (*lookup3)(struct child_struct *child, const char *fname, const char *status);
209         void (*create3)(struct child_struct *child, const char *fname, const char *status);
210         void (*write3)(struct child_struct *child, const char *fname, int offset, int len, int stable, const char *status);
211         void (*commit3)(struct child_struct *child, const char *fname, const char *status);
212         void (*read3)(struct child_struct *child, const char *fname, int offset, int len, const char *status);
213         void (*access3)(struct child_struct *child, const char *fname, int desired, int granted, const char *status);
214         void (*mkdir3)(struct child_struct *child, const char *fname, const char *status);
215         void (*rmdir3)(struct child_struct *child, const char *fname, const char *status);
216         void (*fsstat3)(struct child_struct *child, const char *status);
217         void (*fsinfo3)(struct child_struct *child, const char *status);
218         void (*symlink3)(struct child_struct *child, const char *fname, const char *fname2, const char *status);
219         void (*remove3)(struct child_struct *child, const char *fname, const char *status);
220         void (*readdirplus3)(struct child_struct *child, const char *fname, const char *status);
221         void (*link3)(struct child_struct *child, const char *fname, const char *fname2, const char *status);
222         void (*rename3)(struct child_struct *child, const char *fname, const char *fname2, const char *status);
223 };
224 extern struct nb_operations nb_ops;
225
226 /* CreateDisposition field. */
227 #define FILE_SUPERSEDE 0
228 #define FILE_OPEN 1
229 #define FILE_CREATE 2
230 #define FILE_OPEN_IF 3
231 #define FILE_OVERWRITE 4
232 #define FILE_OVERWRITE_IF 5
233
234 /* CreateOptions field. */
235 #define FILE_DIRECTORY_FILE       0x0001
236 #define FILE_WRITE_THROUGH        0x0002
237 #define FILE_SEQUENTIAL_ONLY      0x0004
238 #define FILE_NON_DIRECTORY_FILE   0x0040
239 #define FILE_NO_EA_KNOWLEDGE      0x0200
240 #define FILE_EIGHT_DOT_THREE_ONLY 0x0400
241 #define FILE_RANDOM_ACCESS        0x0800
242 #define FILE_DELETE_ON_CLOSE      0x1000
243
244 #ifndef O_DIRECTORY
245 #define O_DIRECTORY    0200000
246 #endif
247
248 #include "proto.h"
249
250 extern struct options options;