1 #include <sys/types.h>
2 #include <sys/stat.h>
3 #include <errno.h>
4 #include <fcntl.h>
5 #include <signal.h>
6 #include <stdlib.h>
7 #include <unistd.h>
8 #include <stdio.h>
9
10 #define MAX_ERROR 4
11 #define NB 30L
12 #define NBOUNDS 6
13
14 int errct, subtest, passes, pipesigs;
15 long t1;
16
17 char aa[100];
18 char b[4] = {0, 1, 2, 3}, c[4] = {10, 20, 30, 40}, d[4] = {6, 7, 8, 9};
19 long bounds[NBOUNDS] = {7, 9, 50, 519, 520, 40000L};
20 char buff[30000];
21
22 _PROTOTYPE(int main, (int argc, char *argv[]));
23 _PROTOTYPE(void test19a, (void));
24 _PROTOTYPE(void test19b, (void));
25 _PROTOTYPE(void test19c, (void));
26 _PROTOTYPE(void test19d, (void));
27 _PROTOTYPE(void test19e, (void));
28 _PROTOTYPE(void test19f, (void));
29 _PROTOTYPE(void test19g, (void));
30 _PROTOTYPE(void clraa, (void));
31 _PROTOTYPE(void pipecatcher, (int s));
32 _PROTOTYPE(void e, (int n));
33 _PROTOTYPE(void quit, (void));
34
35
36 int main(argc, argv)
37 int argc;
38 char *argv[];
39 {
40 int i, m;
41
42 m = (argc == 2 ? atoi(argv[1]) : 0xFFFF);
43
44 if (geteuid() == 0 || getuid() == 0) {
45 printf("Test 19 cannot run as root; test aborted\n");
46 exit(1);
47 }
48
49 system("rm -rf DIR_19; mkdir DIR_19");
50 chdir("DIR_19");
51
52 printf("Test 19 ");
53 fflush(stdout);
54 for (i = 0; i < 4; i++) {
55 if (m & 0001) test19a();
56 if (m & 0002) test19b();
57 if (m & 0004) test19c();
58 if (m & 0010) test19d();
59 if (m & 0020) test19e();
60 if (m & 0040) test19f();
61 if (m & 0100) test19g();
62 passes++;
63 }
64 quit();
65 return(-1); /* impossible */
66 }
67
68 void test19a()
69 {
70 /* Test open with O_CREAT and O_EXCL. */
71
72 int fd;
73
74 subtest = 1;
75
76 if ( (fd = creat("T19.a1", 0777)) != 3) e(1); /* create test file */
77 if (close(fd) != 0) e(2);
78 if ( (fd = open("T19.a1", O_RDONLY)) != 3) e(3);
79 if (close(fd) != 0) e(4);
80 if ( (fd = open("T19.a1", O_WRONLY)) != 3) e(5);
81 if (close(fd) != 0) e(6);
82 if ( (fd = open("T19.a1", O_RDWR)) != 3) e(7);
83 if (close(fd) != 0) e(8);
84
85 /* See if O_CREAT actually creates a file. */
86 if ( (fd = open("T19.a2", O_RDONLY)) != -1) e(9); /* must fail */
87 if ( (fd = open("T19.a2", O_RDONLY | O_CREAT, 0444)) != 3) e(10);
88 if (close(fd) != 0) e(11);
89 if ( (fd = open("T19.a2", O_RDONLY)) != 3) e(12);
90 if (close(fd) != 0) e(13);
91 if ( (fd = open("T19.a2", O_WRONLY)) != -1) e(14);
92 if ( (fd = open("T19.a2", O_RDWR)) != -1) e(15);
93
94 /* See what O_CREAT does on an existing file. */
95 if ( (fd = open("T19.a2", O_RDONLY | O_CREAT, 0777)) != 3) e(16);
96 if (close(fd) != 0) e(17);
97 if ( (fd = open("T19.a2", O_RDONLY)) != 3) e(18);
98 if (close(fd) != 0) e(19);
99 if ( (fd = open("T19.a2", O_WRONLY)) != -1) e(20);
100 if ( (fd = open("T19.a2", O_RDWR)) != -1) e(21);
101
102 /* See if O_EXCL works. */
103 if ( (fd = open("T19.a2", O_RDONLY | O_EXCL)) != 3) e(22);
104 if (close(fd) != 0) e(23);
105 if ( (fd = open("T19.a2", O_WRONLY | O_EXCL)) != -1) e(24);
106 if ( (fd = open("T19.a3", O_RDONLY | O_EXCL)) != -1) e(25);
107 if ( (fd = open("T19.a3", O_RDONLY | O_CREAT | O_EXCL, 0444)) != 3) e(26);
108 if (close(fd) != 0) e(27);
109 errno = 0;
110 if ( (fd = open("T19.a3", O_RDONLY | O_CREAT | O_EXCL, 0444)) != -1) e(28);
111 if (errno != EEXIST) e(29);
112
113 if (unlink("T19.a1") != 0) e(30);
114 if (unlink("T19.a2") != 0) e(31);
115 if (unlink("T19.a3") != 0) e(32);
116 }
117
118
119 void test19b()
120 {
121 /* Test open with O_APPEND and O_TRUNC. */
122
123 int fd;
124
125 subtest = 2;
126
127 if ( (fd = creat("T19.b1", 0777)) != 3) e(1); /* create test file */
128 if (write(fd, b, 4) != 4) e(2);
129 if (close(fd) != 0) e(3);
130 clraa();
131 if ( (fd = open("T19.b1", O_RDWR | O_APPEND)) != 3) e(4);
132 if (read(fd, aa, 100) != 4) e(5);
133 if (aa[0] != 0 || aa[1] != 1 || aa[2] != 2 || aa[3] != 3) e(6);
134 if (close(fd) != 0) e(7);
135 if ( (fd = open("T19.b1", O_RDWR | O_APPEND)) != 3) e(8);
136 if (write(fd, b, 4) != 4) e(9);
137 if (lseek(fd, 0L, SEEK_SET) != 0L) e(10);
138 clraa();
139 if (read(fd, aa, 100) != 8) e(11);
140 if (aa[4] != 0 || aa[5] != 1 || aa[6] != 2 || aa[7] != 3) e(12);
141 if (close(fd) != 0) e(13);
142
143 if ( (fd = open("T19.b1", O_RDWR | O_TRUNC)) != 3) e(14);
144 if (read(fd, aa, 100) != 0) e(15);
145 if (close(fd) != 0) e(16);
146
147 unlink("T19.b1");
148 }
149
150
151 void test19c()
152 {
153 /* Test program for open(), close(), creat(), read(), write(), lseek(). */
154
155 int i, n, n1, n2;
156
157 subtest = 3;
158 if ((n = creat("foop", 0777)) != 3) e(1);
159 if ((n1 = creat("foop", 0777)) != 4) e(2);
160 if ((n2 = creat("/", 0777)) != -1) e(3);
161 if (close(n) != 0) e(4);
162 if ((n = open("foop", O_RDONLY)) != 3) e(5);
163 if ((n2 = open("nofile", O_RDONLY)) != -1) e(6);
164 if (close(n1) != 0) e(7);
165
166 /* N is the only one open now. */
167 for (i = 0; i < 2; i++) {
168 n1 = creat("File2", 0777);
169 if (n1 != 4) {
170 printf("creat yielded fd=%d, expected 4\n", n1);
171 e(8);
172 }
173 if ((n2 = open("File2", O_RDONLY)) != 5) e(9);
174 if (close(n1) != 0) e(10);
175 if (close(n2) != 0) e(11);
176 }
177 unlink("File2");
178 if (close(n) != 0) e(12);
179
180 /* All files closed now. */
181 for (i = 0; i < 2; i++) {
182 if ((n = creat("foop", 0777)) != 3) e(13);
183 if (close(n) != 0) e(14);
184 if ((n = open("foop", O_RDWR)) != 3) e(15);
185
186 /* Read/write tests */
187 if (write(n, b, 4) != 4) e(16);
188 if (read(n, aa, 4) != 0) e(17);
189 if (lseek(n, 0L, SEEK_SET) != 0L) e(18);
190 if (read(n, aa, 4) != 4) e(19);
191 if (aa[0] != 0 || aa[1] != 1 || aa[2] != 2 || aa[3] != 3) e(20);
192 if (lseek(n, 0L, SEEK_SET) != 0L) e(21);
193 if (lseek(n, 2L, SEEK_CUR) != 2L) e(22);
194 if (read(n, aa, 4) != 2) e(23);
195 if (aa[0] != 2 || aa[1] != 3 || aa[2] != 2 || aa[3] != 3) e(24);
196 if (lseek(n, 2L, SEEK_SET) != 2L) e(25);
197 clraa();
198 if (write(n, c, 4) != 4) e(26);
199 if (lseek(n, 0L, SEEK_SET) != 0L) e(27);
200 if (read(n, aa, 10) != 6) e(28);
201 if (aa[0] != 0 || aa[1] != 1 || aa[2] != 10 || aa[3] != 20) e(29);
202 if (lseek(n, 16L, SEEK_SET) != 16L) e(30);
203 if (lseek(n, 2040L, SEEK_END) != 2046L) e(31);
204 if (read(n, aa, 10) != 0) e(32);
205 if (lseek(n, 0L, SEEK_CUR) != 2046L) e(33);
206 clraa();
207 if (write(n, c, 4) != 4) e(34);
208 if (lseek(n, 0L, SEEK_CUR) != 2050L) e(35);
209 if (lseek(n, 2040L, SEEK_SET) != 2040L) e(36);
210 clraa();
211 if (read(n, aa, 20) != 10) e(37);
212 if (aa[0] != 0 || aa[5] != 0 || aa[6] != 10 || aa[9] != 40) e(38);
213 if (lseek(n, 10239L, SEEK_SET) != 10239L) e(39);
214 if (write(n, d, 2) != 2) e(40);
215 if (lseek(n, -2L, SEEK_END) != 10239L) e(41);
216 if (read(n, aa, 2) != 2) e(42);
217 if (aa[0] != 6 || aa[1] != 7) e(43);
218 if (lseek(n, NB * 1024L - 2L, SEEK_SET) != NB * 1024L - 2L) e(44);
219 if (write(n, b, 4) != 4) e(45);
220 if (lseek(n, 0L, SEEK_SET) != 0L) e(46);
221 if (lseek(n, -6L, SEEK_END) != 1024L * NB - 4) e(47);
222 clraa();
223 if (read(n, aa, 100) != 6) e(48);
224 if (aa[0] != 0 || aa[1] != 0 || aa[3] != 1 || aa[4] != 2|| aa[5] != 3)
225 e(49);
226 if (lseek(n, 20000L, SEEK_SET) != 20000L) e(50);
227 if (write(n, c, 4) != 4) e(51);
228 if (lseek(n, -4L, SEEK_CUR) != 20000L) e(52);
229 if (read(n, aa, 4) != 4) e(53);
230 if (aa[0] != 10 || aa[1] != 20 || aa[2] != 30 || aa[3] != 40) e(54);
231 if (close(n) != 0) e(55);
232 if ((n1 = creat("foop", 0777)) != 3) e(56);
233 if (close(n1) != 0) e(57);
234 unlink("foop");
235
236 }
237 }
238
239 void test19d()
240 {
241 /* Test read. */
242
243 int i, fd, pd[2];
244 char bb[100];
245
246 subtest = 4;
247
248 for (i = 0; i < 100; i++) bb[i] = i;
249 if ( (fd = creat("T19.d1", 0777)) != 3) e(1); /* create test file */
250 if (write(fd, bb, 100) != 100) e(2);
251 if (close(fd) != 0) e(3);
252 clraa();
253 if ( (fd = open("T19.d1", O_RDONLY)) != 3) e(4);
254 errno = 1000;
255 if (read(fd, aa, 0) != 0) e(5);
256 if (errno != 1000) e(6);
257 if (read(fd, aa, 100) != 100) e(7);
258 if (lseek(fd, 37L, SEEK_SET) != 37L) e(8);
259 if (read(fd, aa, 10) != 10) e(9);
260 if (lseek(fd, 0L, SEEK_CUR) != 47L) e(10);
261 if (read(fd, aa, 100) != 53) e(11);
262 if (aa[0] != 47) e(12);
263 if (read(fd, aa, 1) != 0) e(13);
264 if (close(fd) != 0) e(14);
265
266 /* Read from pipe with no writer open. */
267 if (pipe(pd) != 0) e(15);
268 if (close(pd[1]) != 0) e(16);
269 errno = 2000;
270 if (read(pd[0], aa, 1) != 0) e(17); /* must return EOF */
271 if (errno != 2000) e(18);
272
273 /* Read from a pipe with O_NONBLOCK set. */
274 if (fcntl(pd[0], F_SETFL, O_NONBLOCK) != 0) e(19); /* set O_NONBLOCK */
275 /*
276 if (read(pd[0], aa, 1) != -1) e(20);
277 if (errno != EAGAIN) e(21);
278 */
279 if (close(pd[0]) != 0) e(19);
280 if (unlink("T19.d1") != 0) e(20);
281 }
282
283
284
285 void test19e()
286 {
287 /* Test link, unlink, stat, fstat, dup, umask. */
288
289 int i, j, n, n1, flag;
290 char a[255], b[255];
291 struct stat s, s1;
292
293 subtest = 5;
294 for (i = 0; i < 2; i++) {
295 umask(0);
296
297 if ((n = creat("T3", 0702)) < 0) e(1);
298 if (link("T3", "newT3") < 0) e(2);
299 if ((n1 = open("newT3", O_RDWR)) < 0) e(3);
300 for (j = 0; j < 255; j++) a[j] = j;
301 if (write(n, a, 255) != 255) e(4);
302 if (read(n1, b, 255) != 255) e(5);
303 flag = 0;
304 for (j = 0; j < 255; j++)
305 if (a[j] != b[j]) flag++;
306 if (flag) e(6);
307 if (unlink("T3") < 0) e(7);
308 if (close(n) < 0) e(8);
309 if (close(n1) < 0) e(9);
310 if ((n1 = open("newT3", O_RDONLY)) < 0) e(10);
311 if (read(n1, b, 255) != 255) e(11);
312 flag = 0;
313 for (j = 0; j < 255; j++)
314 if (a[j] != b[j]) flag++;
315 if (flag) e(12);
316
317 /* Now check out stat, fstat. */
318 if (stat("newT3", &s) < 0) e(13);
319 if (s.st_mode != (mode_t) 0100702) e(14);
320 /* The cast was because regular modes are
321 * negative :-(. Anyway, the magic number
322 * should be (S_IFREG | S_IRWXU | S_IWOTH)
323 * for POSIX.
324 */
325 if (s.st_nlink != 1) e(15);
326 if (s.st_size != 255L) e(16);
327 if (fstat(n1, &s1) < 0) e(17);
328 if (s.st_dev != s1.st_dev) e(18);
329 if (s.st_ino != s1.st_ino) e(19);
330 if (s.st_mode != s1.st_mode) e(20);
331 if (s.st_nlink != s1.st_nlink) e(21);
332 if (s.st_uid != s1.st_uid) e(22);
333 if (s.st_gid != s1.st_gid) e(23);
334 if (s.st_rdev != s1.st_rdev) e(24);
335 if (s.st_size != s1.st_size) e(25);
336 if (s.st_atime != s1.st_atime) e(26);
337 if (close(n1) < 0) e(27);
338 if (unlink("newT3") < 0) e(28);
339
340 umask(040);
341 if ((n = creat("T3a", 0777)) < 0) e(29);
342 if (stat("T3a", &s) < 0) e(30);
343 if (s.st_mode != (mode_t) 0100737) e(31); /* negative :-( */
344 if (unlink("T3a") < 0) e(32);
345 if (close(n1) < 0) e(33);
346
347 /* Dup */
348 if ((n = creat("T3b", 0777)) < 0) e(34);
349 if (close(n) < 0) e(35);
350 if ((n = open("T3b", O_RDWR)) < 0) e(36);
351 if ((n1 = dup(n)) != n + 1) e(37);
352 if (write(n, a, 255) != 255) e(38);
353 read(n1, b, 20);
354 if (lseek(n, 0L, SEEK_SET) != 0L) e(39);
355 if ((j = read(n1, b, 1024)) != 255) e(40);
356 if (unlink("T3b") < 0) e(41);
357 if (close(n) < 0) e(42);
358 if (close(n1) < 0) e(43);
359
360 }
361 }
362
363 void test19f()
364 {
365 /* Test large files to see if indirect block stuff works. */
366
367 int fd, i;
368 long pos;
369
370 subtest = 6;
371
372 if (passes > 0) return; /* takes too long to repeat this test */
373 for (i = 0; i < NBOUNDS; i ++) {
374 pos = 1024L * bounds[i];
375 fd = creat("T19f", 0777);
376 if (fd < 0) e(10*i+1);
377 if (lseek(fd, pos, 0) < 0) e(10*i+2);
378 if (write(fd, buff, 30720) != 30720) e(10*i+3);
379 if (close(fd) < 0) e(10*i+3);
380 if (unlink("T19f") < 0) e(10*i+4);
381 }
382 }
383
384
385 void test19g()
386 {
387 /* Test POSIX calls for pipe, read, write, lseek and close. */
388
389 int pipefd[2], n, i, fd;
390 char buf[512], buf2[512];
391
392 subtest = 7;
393
394 for (i = 0; i < 512; i++) buf[i] = i % 128;
395
396 if (pipe(pipefd) < 0) e(1);
397 if (write(pipefd[1], buf, 512) != 512) e(2);
398 if (read(pipefd[0], buf2, 512) != 512) e(3);
399 if (close(pipefd[1]) != 0) e(4);
400 if (close(pipefd[1]) >= 0) e(5);
401 if (read(pipefd[0], buf2, 1) != 0) e(6);
402 if (close(pipefd[0]) != 0) e(7);
403
404 /* Test O_NONBLOCK on pipes. */
405 if (pipe(pipefd) < 0) e(8);
406 if (fcntl(pipefd[0], F_SETFL, O_NONBLOCK) != 0) e(9);
407 if (read(pipefd[0], buf2, 1) != -1) e(10);
408 if (errno != EAGAIN) e(11);
409 if (close(pipefd[0]) != 0) e(12);
410 if (close(pipefd[1]) != 0) e(13);
411
412 /* Test read and lseek. */
413 if ( (fd = creat("T19.g1", 0777)) != 3) e(14); /* create test file */
414 if (write(fd, buf, 512) != 512) e(15);
415 errno = 3000;
416 if (read(fd, buf2, 512) != -1) e(16);
417 if (errno != EBADF) e(17);
418 if (close(fd) != 0) e(18);
419 if ( (fd = open("T19.g1", O_RDWR)) != 3) e(19);
420 if (read(fd, buf2, 512) != 512) e(20);
421 if (read(fd, buf2, 512) != 0) e(21);
422 if (lseek(fd, 100L, SEEK_SET) != 100L) e(22);
423 if (read(fd, buf2, 512) != 412) e(23);
424 if (lseek(fd, 1000L, SEEK_SET) != 1000L) e(24);
425
426 /* Test write. */
427 if (lseek(fd, -1000L, SEEK_CUR) != 0) e(25);
428 if (write(fd, buf, 512) != 512) e(26);
429 if (lseek(fd, 2L, SEEK_SET) != 2) e(27);
430 if (write(fd, buf, 3) != 3) e(28);
431 if (lseek(fd, -2L, SEEK_CUR) != 3) e(29);
432 if (write(fd, &buf[30], 1) != 1) e(30);
433 if (lseek(fd, 2L, SEEK_CUR) != 6) e(31);
434 if (write(fd, &buf[60], 1) != 1) e(32);
435 if (lseek(fd, -512L, SEEK_END) != 0) e(33);
436 if (read(fd, buf2, 8) != 8) e(34);
437 errno = 4000;
438 if (buf2[0] != 0 || buf2[1] != 1 || buf2[2] != 0 || buf2[3] != 30) e(35);
439 if (buf2[4] != 2 || buf2[5] != 5 || buf2[6] != 60 || buf2[7] != 7) e(36);
440
441 /* Turn the O_APPEND flag on. */
442 if (fcntl(fd, F_SETFL, O_APPEND) != 0) e(37);
443 if (lseek(fd, 0L, SEEK_SET) != 0) e(38);
444 if (write(fd, &buf[100], 1) != 1) e(39);
445 if (lseek(fd, 0L, SEEK_SET) != 0) e(40);
446 if (read(fd, buf2, 10) != 10) e(41);
447 if (buf2[0] != 0) e(42);
448 if (lseek(fd, -1L, SEEK_END) != 512) e(43);
449 if (read(fd, buf2, 10) != 1) e(44);
450 if (buf2[0] != 100) e(45);
451 if (close(fd) != 0) e(46);
452
453 /* Now try write with O_NONBLOCK. */
454 if (pipe(pipefd) != 0) e(47);
455 if (fcntl(pipefd[1], F_SETFL, O_NONBLOCK) != 0) e(48);
456 if (write(pipefd[1], buf, 512) != 512) e(49);
457 if (write(pipefd[1], buf, 512) != 512) e(50);
458 errno = 0;
459 for (i = 1; i < 20; i++) {
460 n = write(pipefd[1], buf, 512);
461 if (n == 512) continue;
462 if (n != -1 || errno != EAGAIN) {e(51); break;}
463 }
464 if (read(pipefd[0], buf, 512) != 512) e(52);
465 if (close(pipefd[0]) != 0) e(53);
466
467 /* Write to a pipe with no reader. This should generate a signal. */
468 signal(SIGPIPE, pipecatcher);
469 errno = 0;
470 if (write(pipefd[1], buf, 1) != -1) e(54);
471 if (errno != EPIPE) e(55);
472 if (pipesigs != passes + 1) e(56); /* we should have had the sig now */
473 if (close(pipefd[1]) != 0) e(57);
474 errno = 0;
475 if (write(100, buf, 512) != -1) e(58);
476 if (errno != EBADF) e(59);
477 if (unlink("T19.g1") != 0) e(60);
478 }
479
480
481 void clraa()
482 {
483 int i;
484 for (i = 0; i < 100; i++) aa[i] = 0;
485 }
486
487
488 void pipecatcher(s)
489 int s; /* it is supposed to have an arg */
490 {
491 pipesigs++;
492 }
493
494
495 void e(n)
496 int n;
497 {
498 int err_num = errno; /* save errno in case printf clobbers it */
499
500 printf("Subtest %d, error %d errno=%d ", subtest, n, errno);
501 fflush(stdout); /* aargh! Most results go to stdout and are
502 * messed up by perror going to stderr.
503 * Should replace perror by printf and strerror
504 * in all the tests.
505 */
506 errno = err_num; /* restore errno, just in case */
507 perror("");
508 if (errct++ > MAX_ERROR) {
509 printf("Too many errors; test aborted\n");
510 chdir("..");
511 system("rm -rf DIR*");
512 exit(1);
513 }
514 }
515
516 void quit()
517 {
518
519 chdir("..");
520 system("rm -rf DIR*");
521
522 if (errct == 0) {
523 printf("ok\n");
524 exit(0);
525 } else {
526 printf("%d errors\n", errct);
527 exit(1);
528 }
529 }
530
531
532
This page was automatically generated by the
LXR engine.
Visit the LXR main site for more
information.