|
|
1.1 root 1: /* @(#)test5.c 1.5 90/01/03 NFS Rev 2 Testsuite
2: * 1.5 Lachman ONC Test Suite source
3: *
4: * Test read and write
5: *
6: * Uses the following important system calls against the server:
7: *
8: * chdir()
9: * mkdir() (for initial directory creation if not -m)
10: * creat()
11: * open()
12: * read()
13: * write()
14: * stat()
15: * fstat()
16: * unlink()
17: */
18:
19: #include <sys/param.h>
20: #ifndef major
21: #include <sys/types.h>
22: #endif
23: #ifdef SVR3
24: #include <sys/fs/nfs/time.h>
25: #include <fcntl.h>
26: #else
27: #include <sys/time.h>
28: #endif
29: #include <sys/stat.h>
30: #include <stdio.h>
31: #include "tests.h"
32:
33: #ifndef MIN
34: #define MIN(a, b) ((a) < (b) ? (a) : (b))
35: #endif
36:
37: #define BUFSZ 8192
38: #define DSIZE 1048576
39:
40: int Tflag = 0; /* print timing */
41: int Hflag = 0; /* print help message */
42: int Fflag = 0; /* test function only; set count to 1, negate -t */
43: int Nflag = 0; /* Suppress directory operations */
44: #ifdef SVR3
45: int Sflag = 0; /* use synchronous writes */
46: #endif
47:
48: usage()
49: {
50: #ifdef SVR3
51: fprintf(stdout, "usage: %s [-htfns] [size count fname]\n", Myname);
52: #else
53: fprintf(stdout, "usage: %s [-htfn] [size count fname]\n", Myname);
54: #endif
55: fprintf(stdout, " Flags: h Help - print this usage info\n");
56: fprintf(stdout, " t Print execution time statistics\n");
57: fprintf(stdout, " f Test function only (negate -t)\n");
58: fprintf(stdout, " n Suppress test directory create operations\n");
59: #ifdef SVR3
60: fprintf(stdout, " s Use synchronous writes\n");
61: #endif
62: }
63:
64: main(argc, argv)
65: int argc;
66: char *argv[];
67: {
68: int count = DCOUNT; /* times to do each file */
69: int ct;
70: int size = DSIZE;
71: int si;
72: int i;
73: int fd;
74: int bytes;
75: #ifdef SVR3
76: int oflags;
77: #endif
78: char *bigfile = "bigfile";
79: struct timeval time;
80: char str[MAXPATHLEN];
81: struct stat statb;
82: char *opts;
83: char buf[BUFSZ];
84:
85: umask(0);
86: setbuf(stdout, NULL);
87: Myname = *argv++;
88: argc--;
89: while (argc && **argv == '-') {
90: for (opts = &argv[0][1]; *opts; opts++) {
91: switch (*opts) {
92: case 'h': /* help */
93: usage();
94: exit(1);
95:
96: case 't': /* time */
97: Tflag++;
98: break;
99:
100: case 'f': /* funtionality */
101: Fflag++;
102: break;
103:
104: case 'n': /* No Test Directory create */
105: Nflag++;
106: break;
107:
108: #ifdef SVR3
109: case 's': /* synchronous writes */
110: Sflag++;
111: break;
112: #endif
113:
114: default:
115: error("unknown option '%c'", *opts);
116: usage();
117: exit(1);
118: }
119: }
120: argc--;
121: argv++;
122: }
123:
124: if (argc) {
125: size = getparm(*argv, 1, "size");
126: if (size <= 0) {
127: usage();
128: exit(1);
129: }
130: argv++;
131: argc--;
132: }
133: if (argc) {
134: count = getparm(*argv, 1, "count");
135: if (count <= 0) {
136: usage();
137: exit(1);
138: }
139: argv++;
140: argc--;
141: }
142: if (argc) {
143: bigfile = *argv;
144: argv++;
145: argc--;
146: }
147: if (argc) {
148: usage();
149: exit(1);
150: }
151:
152: if (Fflag) {
153: Tflag = 0;
154: count = 1;
155: }
156:
157: #ifdef SVR3
158: if (Sflag) {
159: oflags = O_WRONLY|O_SYNC|O_CREAT|O_TRUNC;
160: } else {
161: oflags = O_WRONLY|O_CREAT|O_TRUNC;
162: }
163: #endif
164:
165: fprintf(stdout, "%s: read and write\n", Myname);
166:
167: if (!Nflag)
168: testdir(NULL);
169: else
170: mtestdir(NULL);
171:
172: for (i=0; i < BUFSZ / sizeof(int); i++) {
173: ((int *)buf)[i] = i;
174: }
175:
176: if (Tflag) {
177: starttime();
178: }
179:
180: for (ct = 0; ct < count; ct++) {
181: #ifdef SVR3
182: if ((fd = open(bigfile, oflags, 0666)) < 0) {
183: #else
184: if ((fd = creat(bigfile, 0666)) < 0) {
185: #endif
186: error("can't create '%s'", bigfile);
187: exit(1);
188: }
189: if (fstat(fd, &statb) < 0) {
190: error("can't stat '%s'", bigfile);
191: exit(1);
192: }
193: if (statb.st_size != 0) {
194: error("'%s' has size %d, should be 0",
195: bigfile, statb.st_size);
196: exit(1);
197: }
198: for (si = size; si > 0; si -= bytes) {
199: bytes = MIN(BUFSZ, si);
200: if (write(fd, buf, bytes) != bytes) {
201: error("'%s' write failed", bigfile);
202: exit(1);
203: }
204: }
205: close(fd);
206: if (stat(bigfile, &statb) < 0) {
207: error("can't stat '%s'", bigfile);
208: exit(1);
209: }
210: if (statb.st_size != size) {
211: error("'%s' has size %d, should be %d",
212: bigfile, statb.st_size, size);
213: exit(1);
214: }
215: }
216:
217: if (Tflag) {
218: endtime(&time);
219: }
220:
221: if ((fd = open(bigfile, 0)) < 0) {
222: error("can't open '%s'", bigfile);
223: exit(1);
224: }
225: for (si = size; si > 0; si -= bytes) {
226: bytes = MIN(BUFSZ, si);
227: if (read(fd, buf, bytes) != bytes) {
228: error("'%s' read failed", bigfile);
229: exit(1);
230: }
231: for (i = 0; i < bytes / sizeof(int); i++) {
232: if (((int *)buf)[i] != i) {
233: error("bad data in '%s'", bigfile);
234: exit(1);
235: }
236: }
237: }
238: close(fd);
239:
240: fprintf(stdout, "\twrote %d byte file %d times", size, count);
241: if (Tflag) {
242: fprintf(stdout, " in %d.%-2d seconds (%d bytes/sec)",
243: time.tv_sec, time.tv_usec / 10000, size*count/time.tv_sec);
244: }
245: fprintf(stdout, "\n");
246: if (Tflag) {
247: starttime();
248: }
249:
250: for (ct = 0; ct < count; ct++) {
251: if ((fd = open(bigfile, 0)) < 0) {
252: error("can't open '%s'", bigfile);
253: exit(1);
254: }
255: for (si = size; si > 0; si -= bytes) {
256: bytes = MIN(BUFSZ, si);
257: if (read(fd, buf, bytes) != bytes) {
258: error("'%s' read failed", bigfile);
259: exit(1);
260: }
261: }
262: close(fd);
263: }
264:
265: if (Tflag) {
266: endtime(&time);
267: }
268: fprintf(stdout, "\tread %d byte file %d times", size, count);
269: if (Tflag) {
270: fprintf(stdout, " in %d.%-2d seconds (%d bytes/sec)",
271: time.tv_sec, time.tv_usec / 10000, size*count/time.tv_sec);
272: }
273: fprintf(stdout, "\n");
274:
275: if (unlink(bigfile) < 0) {
276: error("can't unlink '%s'", bigfile);
277: exit(1);
278: }
279: complete();
280: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.