~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

Minix Cross Reference
Minix/test/test19.c


  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 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.