001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019 #include <crt.h>
020 #include <libc.h>
021 #include <stdarg.h>
022 #include <string.h>
023 #include <debug.h>
024
025 #include "fstest_utils.h"
026
027
028
029
030
031
032
033 int main()
034 {
035 int fd, len;
036 char buff[256];
037
038 bochs_printf("Hi from fstest\n");
039
040 ls("/", 1, 1);
041 ls(".", 1, 1);
042 ls("", 1, 1);
043 ls(0, 1, 1);
044
045 TEST_EXPECT_CONDITION(fd = open("", 0),
046 RETVAL < 0);
047
048 TEST_EXPECT_CONDITION(fd = open(0, 0),
049 RETVAL < 0);
050
051 TEST_EXPECT_CONDITION(fd = open("/", O_RDWR),
052 RETVAL == 0);
053
054 TEST_EXPECT_CONDITION(fd = open("/", O_RDONLY),
055 RETVAL == 1);
056
057 TEST_EXPECT_CONDITION(fd = open("/", O_WRONLY),
058 RETVAL == 2);
059
060 TEST_EXPECT_CONDITION(close(1),
061 RETVAL == 0);
062
063 TEST_EXPECT_CONDITION(fd = open("/", O_WRONLY),
064 RETVAL == 1);
065
066 TEST_EXPECT_CONDITION(fd = open("//", O_WRONLY),
067 RETVAL == 3);
068
069 TEST_EXPECT_CONDITION(fd = open("////////", O_WRONLY),
070 RETVAL == 4);
071
072 TEST_EXPECT_CONDITION(fd = open("/does not exist", O_WRONLY),
073 RETVAL < 0);
074
075 TEST_EXPECT_CONDITION(fd = open("////does not exist", O_WRONLY),
076 RETVAL < 0);
077
078 TEST_EXPECT_CONDITION(fd = open("/does not exist/", O_WRONLY),
079 RETVAL < 0);
080
081 TEST_EXPECT_CONDITION(fd = open("////does not exist/", O_WRONLY),
082 RETVAL < 0);
083
084 TEST_EXPECT_CONDITION(fd = open("/does not exist////", O_WRONLY),
085 RETVAL < 0);
086
087 TEST_EXPECT_CONDITION(fd = open("////does not exist/////", O_WRONLY),
088 RETVAL < 0);
089
090 TEST_EXPECT_CONDITION(fd = open("does not exist", O_WRONLY),
091 RETVAL < 0);
092
093 TEST_EXPECT_CONDITION(fd = open("does not exist/", O_WRONLY),
094 RETVAL < 0);
095
096 TEST_EXPECT_CONDITION(fd = open("does not exist////", O_WRONLY),
097 RETVAL);
098
099 TEST_EXPECT_CONDITION(fd = open("/does not exist/ab c d", O_WRONLY),
100 RETVAL < 0);
101
102 TEST_EXPECT_CONDITION(fd = open("////does not exist/ab c d", O_WRONLY),
103 RETVAL < 0);
104
105 TEST_EXPECT_CONDITION(fd = open("/does not exist////ab c d", O_WRONLY),
106 RETVAL < 0);
107
108 TEST_EXPECT_CONDITION(fd = open("////does not exist/////ab c d", O_WRONLY),
109 RETVAL < 0);
110
111 TEST_EXPECT_CONDITION(fd = open("does not exist", O_WRONLY),
112 RETVAL < 0);
113
114 TEST_EXPECT_CONDITION(fd = open("does not exist/ab c d", O_WRONLY),
115 RETVAL < 0);
116
117 TEST_EXPECT_CONDITION(fd = open("does not exist////ab c d", O_WRONLY),
118 RETVAL < 0);
119
120 TEST_EXPECT_CONDITION(fd = open("/", O_RDWR),
121 RETVAL == 5);
122
123 TEST_EXPECT_CONDITION(fd = open("/tutu.txt", O_RDWR),
124 RETVAL < 0);
125
126 ls("/", 1, 1);
127
128 TEST_EXPECT_CONDITION(fd = open("/tutu.txt", O_RDWR | O_CREAT,
129 S_IRUSR | S_IWUSR),
130 RETVAL == 6);
131
132 ls("/", 1, 1);
133
134 TEST_EXPECT_CONDITION(fd = open("tutu.txt", O_RDWR | O_CREAT),
135 RETVAL == 7);
136
137
138 TEST_EXPECT_CONDITION(fd = open("tutu.txt", O_RDWR | O_CREAT | O_EXCL),
139 RETVAL < 0);
140
141 TEST_EXPECT_CONDITION(fd = open("/toto.txt", O_RDWR | O_CREAT | O_EXCL,
142 S_IRWXALL),
143 RETVAL == 8);
144
145
146 TEST_EXPECT_CONDITION(fd = open("toto.txt", O_RDWR | O_CREAT | O_EXCL),
147 RETVAL < 0);
148
149 TEST_EXPECT_CONDITION(fd = open("toto.txt", O_RDWR | O_CREAT,
150 S_IRUSR | S_IWUSR),
151 RETVAL == 9);
152
153
154 TEST_EXPECT_CONDITION(fd = open("toto.txt/", O_RDWR), RETVAL < 0);
155 TEST_EXPECT_CONDITION(fd = open("notdir/", O_RDWR | O_CREAT, S_IRWXALL),
156 RETVAL < 0);
157 TEST_EXPECT_CONDITION(fd = open("notdir/", O_RDWR), RETVAL < 0);
158
159
160 TEST_EXPECT_CONDITION(fd = open("toto1.txt", O_RDWR),
161 RETVAL < 0);
162 TEST_EXPECT_CONDITION(fd = open("toto1.tx", O_RDWR | O_CREAT, S_IWUSR),
163 RETVAL == 10);
164
165
166 TEST_EXPECT_CONDITION(fd = open("toto.tx", O_RDWR),
167 RETVAL < 0);
168 TEST_EXPECT_CONDITION(fd = open("toto.tx", O_RDWR | O_CREAT,
169 S_IRUSR | S_IWUSR),
170 RETVAL == 11);
171
172
173
174
175
176 TEST_EXPECT_CONDITION(len = read(fd, buff, 256),
177 RETVAL == 0);
178
179 TEST_EXPECT_CONDITION(lseek(fd, 0, SEEK_SET),
180 RETVAL == 0);
181
182 strzcpy(buff, "Bonjour !", 256);
183 TEST_EXPECT_CONDITION(len = write(fd, buff, 10),
184 RETVAL == 10);
185
186 ls("/", 1, 1);
187
188 TEST_EXPECT_CONDITION(lseek(fd, 0, SEEK_SET),
189 RETVAL == 0);
190
191 strzcpy(buff, "Garbage garbage garbage", 256);
192 TEST_EXPECT_CONDITION(len = read(fd, buff, 256),
193 RETVAL == 10);
194 bochs_printf("read s='%s'\n", buff);
195 TEST_EXPECT_CONDITION(strcmp("Bonjour !", buff), RETVAL ==0);
196 TEST_EXPECT_CONDITION(lseek(fd, 0, SEEK_CUR), RETVAL == 10);
197
198
199
200
201
202 TEST_EXPECT_CONDITION(ftruncate(fd, 3), RETVAL == 0);
203
204
205 TEST_EXPECT_CONDITION(lseek(fd, 0, SEEK_CUR), RETVAL == 10);
206
207
208
209 strzcpy(buff, "Garbage garbage garbage", 256);
210 TEST_EXPECT_CONDITION(len = read(fd, buff, 256), RETVAL == 0);
211
212
213 TEST_EXPECT_CONDITION(lseek(fd, 0, SEEK_SET), RETVAL == 0);
214
215
216
217 strzcpy(buff, "Garbage garbage garbage", 256);
218 TEST_EXPECT_CONDITION(len = read(fd, buff, 256), RETVAL == 3);
219 bochs_printf("read s='%s'\n", buff);
220 TEST_EXPECT_CONDITION(strncmp("Bon", buff, len), RETVAL == 0);
221
222
223
224
225
226 ls("/", 1, 1);
227
228
229
230
231 TEST_EXPECT_CONDITION(fd = open("toto2.txt", O_RDWR | O_CREAT, S_IRUSR),
232 RETVAL == 12);
233
234 strzcpy(buff, "Garbage garbage garbage", 256);
235 TEST_EXPECT_CONDITION(len = read(fd, buff, 256),
236 RETVAL == 0);
237
238 TEST_EXPECT_CONDITION(lseek(fd, 0, SEEK_SET), RETVAL == 0);
239
240 strzcpy(buff, "Permission denied", 256);
241 TEST_EXPECT_CONDITION(len = write(fd, buff, 10),
242 RETVAL < 0);
243
244 TEST_EXPECT_CONDITION(lseek(fd, 0, SEEK_SET), RETVAL == 0);
245
246 strzcpy(buff, "Garbage garbage garbage", 256);
247 TEST_EXPECT_CONDITION(len = read(fd, buff, 256), RETVAL == 0);
248
249
250
251 TEST_EXPECT_CONDITION(fd = open("toto3.txt", O_RDONLY | O_CREAT,
252 S_IRUSR | S_IWUSR),
253 RETVAL == 13);
254
255 strzcpy(buff, "Garbage garbage garbage", 256);
256 TEST_EXPECT_CONDITION(len = read(fd, buff, 256), RETVAL == 0);
257
258 TEST_EXPECT_CONDITION(lseek(fd, 0, SEEK_SET), RETVAL == 0);
259
260 strzcpy(buff, "Permission denied 2", 256);
261 TEST_EXPECT_CONDITION(len = write(fd, buff, 10),
262 RETVAL < 0);
263
264 TEST_EXPECT_CONDITION(lseek(fd, 0, SEEK_SET), RETVAL == 0);
265
266 strzcpy(buff, "Garbage garbage garbage", 256);
267 TEST_EXPECT_CONDITION(len = read(fd, buff, 256), RETVAL == 0);
268
269
270 if (fork() == 0)
271 {
272 bochs_printf("Hello from child\n");
273 TEST_EXPECT_CONDITION(fd = open("shrd.txt", O_RDWR | O_CREAT, S_IRWXALL),
274 RETVAL == 14);
275 strzcpy(buff, "Hello from child !", 256);
276 TEST_EXPECT_CONDITION(len = write(fd, buff, 19),
277 RETVAL == 19);
278 TEST_EXPECT_CONDITION(close(fd), RETVAL == 0);
279 bochs_printf("Bye from child\n");
280 return 0;
281 }
282
283 bochs_printf("Father sleeping\n");
284 nanosleep(1, 0);
285 ls("/", 1, 1);
286 TEST_EXPECT_CONDITION(fd = open("shrd.txt", O_RDONLY),
287 RETVAL == 14);
288 strzcpy(buff, "Garbage garbage garbage", 256);
289 TEST_EXPECT_CONDITION(len = read(fd, buff, 256),
290 RETVAL == 19);
291 bochs_printf("read s='%s'\n", buff);
292 TEST_EXPECT_CONDITION(strncmp("Hello from child !", buff, len),
293 RETVAL == 0);
294 TEST_EXPECT_CONDITION(close(fd), RETVAL == 0);
295 TEST_EXPECT_CONDITION(unlink("shrd.txt"), RETVAL == 0);
296 ls("/", 1, 1);
297
298
299
300
301
302 TEST_EXPECT_CONDITION(fcntl(fd, 2, 3), RETVAL < 0);
303
304
305 ls("/", 1, 1);
306
307
308
309
310 TEST_EXPECT_CONDITION(creat("toto4.txt", S_IRUSR), RETVAL == 0);
311 TEST_EXPECT_CONDITION(creat("toto4.txt", S_IRWXALL), RETVAL < 0);
312 TEST_EXPECT_CONDITION(link("toto4.txt", "toto5.txt"), RETVAL == 0);
313 TEST_EXPECT_CONDITION(link("toto4.txt", "toto5.txt"), RETVAL < 0);
314 TEST_EXPECT_CONDITION(link("toto4.txt", "toto.txt"), RETVAL < 0);
315 ls("/", 1, 1);
316 TEST_EXPECT_CONDITION(chmod("toto5.txt", S_IRUSR | S_IWUSR), RETVAL == 0);
317 ls("/", 1, 1);
318
319 TEST_EXPECT_CONDITION(fd = open("toto5.txt", O_RDWR), RETVAL == 14);
320 strzcpy(buff, "Garbage garbage garbage", 256);
321 TEST_EXPECT_CONDITION(len = read(fd, buff, 256), RETVAL == 0);
322
323 TEST_EXPECT_CONDITION(lseek(fd, 0, SEEK_SET), RETVAL == 0);
324
325 strzcpy(buff, "Hello world from toto5", 256);
326 TEST_EXPECT_CONDITION(len = write(fd, buff, 24), RETVAL == 24);
327
328 TEST_EXPECT_CONDITION(lseek(fd, 0, SEEK_SET), RETVAL == 0);
329
330 strzcpy(buff, "Garbage garbage garbage", 256);
331 TEST_EXPECT_CONDITION(len = read(fd, buff, 256), RETVAL == 24);
332 bochs_printf("read s='%s'\n", buff);
333
334 TEST_EXPECT_CONDITION(fd = open("toto4.txt", O_RDWR), RETVAL == 15);
335 strzcpy(buff, "Garbage garbage garbage", 256);
336 TEST_EXPECT_CONDITION(len = read(fd, buff, 256), RETVAL == 24);
337 bochs_printf("read s='%s'\n", buff);
338
339 ls("/", 1, 1);
340
341 TEST_EXPECT_CONDITION(link("dangling", "toto42.txt"), RETVAL < 0);
342 TEST_EXPECT_CONDITION(unlink("toto4.txt"), RETVAL == 0);
343 TEST_EXPECT_CONDITION(unlink("toto42.txt"), RETVAL < 0);
344 TEST_EXPECT_CONDITION(unlink("toto4.txt"), RETVAL < 0);
345 TEST_EXPECT_CONDITION(creat("toto4.txt", S_IWUSR | S_IRUSR), RETVAL == 0);
346 TEST_EXPECT_CONDITION(unlink("toto5.txt/"), RETVAL < 0);
347 TEST_EXPECT_CONDITION(rmdir("toto5.txt/"), RETVAL < 0);
348 TEST_EXPECT_CONDITION(rmdir("toto5.txt"), RETVAL < 0);
349 TEST_EXPECT_CONDITION(unlink("toto5.txt"), RETVAL == 0);
350 TEST_EXPECT_CONDITION(unlink("toto5.txt"), RETVAL < 0);
351 TEST_EXPECT_CONDITION(creat("toto4.txt", S_IRWXALL), RETVAL < 0);
352
353 ls("/", 1, 1);
354
355
356 TEST_EXPECT_CONDITION(symlink("toto4.txt", "toto5.txt"), RETVAL == 0);
357 TEST_EXPECT_CONDITION(symlink("toto4.txt", "toto5.txt"), RETVAL < 0);
358 TEST_EXPECT_CONDITION(symlink("toto4.txt", "toto.txt"), RETVAL < 0);
359
360 ls("/", 1, 1);
361
362 TEST_EXPECT_CONDITION(fd = open("toto5.txt", O_RDWR), RETVAL == 16);
363 strzcpy(buff, "Garbage garbage garbage", 256);
364 TEST_EXPECT_CONDITION(len = read(fd, buff, 256), RETVAL == 0);
365
366 TEST_EXPECT_CONDITION(lseek(fd, 0, SEEK_SET), RETVAL == 0);
367
368 strzcpy(buff, "Hello world from toto5", 256);
369 TEST_EXPECT_CONDITION(len = write(fd, buff, 24), RETVAL == 24);
370
371 TEST_EXPECT_CONDITION(lseek(fd, 0, SEEK_SET), RETVAL == 0);
372
373 strzcpy(buff, "Garbage garbage garbage", 256);
374 TEST_EXPECT_CONDITION(len = read(fd, buff, 256), RETVAL == 24);
375 bochs_printf("read s='%s'\n", buff);
376 TEST_EXPECT_CONDITION(strcmp(buff, "Hello world from toto5"), RETVAL == 0);
377
378 TEST_EXPECT_CONDITION(fd = open("toto4.txt", O_RDWR), RETVAL == 17);
379 strzcpy(buff, "Garbage garbage garbage", 256);
380 TEST_EXPECT_CONDITION(len = read(fd, buff, 256), RETVAL == 24);
381 bochs_printf("read s='%s'\n", buff);
382 TEST_EXPECT_CONDITION(strcmp(buff, "Hello world from toto5"), RETVAL == 0);
383
384
385 TEST_EXPECT_CONDITION(symlink("dangling", "toto6.txt"), RETVAL == 0);
386 TEST_EXPECT_CONDITION(symlink("dangling", "toto6.txt"), RETVAL < 0);
387
388 TEST_EXPECT_CONDITION(fd = open("toto6.txt", O_RDWR), RETVAL < 0);
389 TEST_EXPECT_CONDITION(fd = open("toto6.txt", O_RDWR | O_NOFOLLOW), RETVAL == 18);
390 strzcpy(buff, "Garbage garbage garbage", 256);
391 TEST_EXPECT_CONDITION(len = read(fd, buff, 256), RETVAL == 8);
392 bochs_printf("read s='%s'\n", buff);
393 TEST_EXPECT_CONDITION(strncmp(buff, "dangling", len), RETVAL == 0);
394
395 ls("/", 1, 1);
396
397
398
399 TEST_EXPECT_CONDITION(mkdir("yo1", S_IRUSR | S_IXUSR), RETVAL == 0);
400 TEST_EXPECT_CONDITION(mkdir("yo1", S_IRWXALL), RETVAL < 0);
401
402 ls("/", 1, 1);
403
404 TEST_EXPECT_CONDITION(unlink("yo1"), RETVAL < 0);
405 TEST_EXPECT_CONDITION(unlink("yo1/"), RETVAL < 0);
406 TEST_EXPECT_CONDITION(rmdir("yo1"), RETVAL == 0);
407 TEST_EXPECT_CONDITION(rmdir("yo1"), RETVAL < 0);
408 TEST_EXPECT_CONDITION(rmdir("yoda"), RETVAL < 0);
409
410 ls("/", 1, 1);
411
412 TEST_EXPECT_CONDITION(mkdir("yoplait1", S_IRWXALL), RETVAL == 0);
413 TEST_EXPECT_CONDITION(rename("yoplait1", "mouf1"), RETVAL == 0);
414 TEST_EXPECT_CONDITION(fd = open("mouf1/a", O_RDWR | O_CREAT, S_IRWXALL), RETVAL == 19);
415 TEST_EXPECT_CONDITION(unlink("mouf1/a"), RETVAL == 0);
416 TEST_EXPECT_CONDITION(rmdir("mouf1"), RETVAL == 0);
417
418 TEST_EXPECT_CONDITION(mkdir("yoplait2", S_IRWXALL), RETVAL == 0);
419 TEST_EXPECT_CONDITION(rename("yoplait2", "mouf2"), RETVAL == 0);
420 TEST_EXPECT_CONDITION(fd = open("mouf2/a", O_RDWR | O_CREAT, S_IRWXALL), RETVAL == 20);
421 TEST_EXPECT_CONDITION(rmdir("mouf2"), RETVAL < 0);
422
423 TEST_EXPECT_CONDITION(mkdir("yoplait3", S_IRWXALL), RETVAL == 0);
424 TEST_EXPECT_CONDITION(rename("yoplait3", "mouf3"), RETVAL == 0);
425 TEST_EXPECT_CONDITION(creat("mouf3/a", S_IRWXALL), RETVAL == 0);
426 TEST_EXPECT_CONDITION(unlink("mouf3/a"), RETVAL == 0);
427 TEST_EXPECT_CONDITION(rmdir("mouf3"), RETVAL == 0);
428
429 TEST_EXPECT_CONDITION(mkdir("yoplait4", S_IRWXALL), RETVAL == 0);
430 TEST_EXPECT_CONDITION(rename("yoplait4", "mouf4"), RETVAL == 0);
431 TEST_EXPECT_CONDITION(creat("mouf4/a", S_IRWXALL), RETVAL == 0);
432 TEST_EXPECT_CONDITION(rmdir("mouf4"), RETVAL < 0);
433
434 ls("/", 1, 1);
435
436 ls("/", 1, 1);
437 ls("..", 1, 1);
438 ls("../", 1, 1);
439 ls("/..", 1, 1);
440
441
442 TEST_EXPECT_CONDITION(fd = open("yo1/titi1.txt", O_RDONLY), RETVAL < 0);
443 TEST_EXPECT_CONDITION(fd = open("yo1/titi1.txt", O_RDONLY | O_CREAT, S_IRUSR), RETVAL < 0);
444
445 ls("/", 1, 1);
446 ls("/yo1", 1, 1);
447
448 TEST_EXPECT_CONDITION(mkdir("yo1", S_IRWXALL), RETVAL == 0);
449 TEST_EXPECT_CONDITION(fd = open("yo1/titi1.txt", O_RDONLY), RETVAL < 0);
450 TEST_EXPECT_CONDITION(fd = open("yo1/titi1.txt", O_RDONLY | O_CREAT, S_IRUSR), RETVAL == 21);
451
452 ls("/", 1, 1);
453 ls("/yo1", 1, 1);
454
455 TEST_EXPECT_CONDITION(mkdir("yo2", S_IRUSR | S_IXUSR), RETVAL == 0);
456 TEST_EXPECT_CONDITION(fd = open("yo2/titi1.txt", O_RDONLY), RETVAL < 0);
457 TEST_EXPECT_CONDITION(fd = open("yo2/titi1.txt", O_RDONLY | O_CREAT, S_IRUSR), RETVAL < 0);
458
459 ls("/", 1, 1);
460
461 TEST_EXPECT_CONDITION(mkdir("yo3", S_IWUSR | S_IXUSR), RETVAL == 0);
462 TEST_EXPECT_CONDITION(fd = open("yo3/titi1.txt", O_RDONLY), RETVAL < 0);
463 TEST_EXPECT_CONDITION(fd = open("yo3/titi1.txt", O_RDONLY | O_CREAT, S_IRUSR), RETVAL == 22);
464
465 ls("/", 1, 1);
466
467 TEST_EXPECT_CONDITION(mkdir("yo4", S_IWUSR), RETVAL == 0);
468 TEST_EXPECT_CONDITION(fd = open("yo4/titi1.txt", O_RDONLY), RETVAL < 0);
469 TEST_EXPECT_CONDITION(fd = open("yo4/titi1.txt", O_RDONLY | O_CREAT, S_IRUSR), RETVAL < 0);
470
471 ls("/", 1, 1);
472
473 TEST_EXPECT_CONDITION(chdir("nowhere"), RETVAL < 0);
474 TEST_EXPECT_CONDITION(chdir("yo1"), RETVAL == 0);
475
476 ls(".", 1, 1);
477 ls("/", 1, 1);
478 ls("..", 1, 1);
479 ls("../../../../", 1, 1);
480 ls("/../../../../", 1, 1);
481
482
483
484 TEST_EXPECT_CONDITION(chroot("nowhere"), RETVAL < 0);
485 TEST_EXPECT_CONDITION(chroot("."), RETVAL == 0);
486 ls(".", 1, 1);
487 ls("/", 1, 1);
488 ls("..", 1, 1);
489 ls("../../../../", 1, 1);
490 ls("/../../../../", 1, 1);
491
492
493 TEST_EXPECT_CONDITION(mount(NULL, "nowhere", NULL, 0, NULL), RETVAL < 0);
494 TEST_EXPECT_CONDITION(mount(NULL, "nowhere", "yoplait", 0, NULL), RETVAL < 0);
495 TEST_EXPECT_CONDITION(mount(NULL, "nowhere", "virtfs", 0, NULL), RETVAL < 0);
496
497 TEST_EXPECT_CONDITION(mkdir("mnt", S_IRWXALL), RETVAL == 0);
498 TEST_EXPECT_CONDITION(mkdir("mnt/subdir0", S_IRWXALL), RETVAL == 0);
499 ls("/", 1, 1);
500 TEST_EXPECT_CONDITION(mount(NULL, "mnt", "virtfs", 0, NULL), RETVAL == 0);
501 ls("/", 1, 1);
502 TEST_EXPECT_CONDITION(mkdir("mnt/subdir_mounted", S_IRWXALL), RETVAL == 0);
503 ls("/", 1, 1);
504
505
506 TEST_EXPECT_CONDITION(fd = open("mnt/subdir_mounted", O_DIRECTORY), RETVAL == 23);
507 TEST_EXPECT_CONDITION(umount("mnt"), RETVAL < 0);
508 TEST_EXPECT_CONDITION(close(fd), RETVAL == 0);
509
510
511 TEST_EXPECT_CONDITION(chdir("mnt"), RETVAL == 0);
512 TEST_EXPECT_CONDITION(umount("/mnt"), RETVAL < 0);
513 TEST_EXPECT_CONDITION(chdir(".."), RETVAL == 0);
514 ls(".", 1, 1);
515
516
517 if (fork() == 0)
518 {
519 bochs_printf("Hello from child\n");
520 TEST_EXPECT_CONDITION(chdir("mnt"), RETVAL == 0);
521 TEST_EXPECT_CONDITION(fd = open("subdir_mounted", O_DIRECTORY), RETVAL == 23);
522 bochs_printf("Child sleeping...\n");
523 nanosleep(2, 0);
524 bochs_printf("Bye from child\n");
525 return 0;
526 }
527 else
528 {
529 bochs_printf("Father sleeping\n");
530 nanosleep(1, 0);
531 bochs_printf("Father trying to umount, should fail (a process chdir'ed in it)\n");
532 TEST_EXPECT_CONDITION(umount("mnt"), RETVAL < 0);
533 bochs_printf("Father Resuming normal operation in 3s...\n");
534 nanosleep(3, 0);
535 }
536
537 TEST_EXPECT_CONDITION(umount(NULL), RETVAL < 0);
538 TEST_EXPECT_CONDITION(umount("nowhere"), RETVAL < 0);
539 ls("/", 1, 1);
540 TEST_EXPECT_CONDITION(umount("mnt"), RETVAL == 0);
541 ls("/", 1, 1);
542 TEST_EXPECT_CONDITION(umount("mnt"), RETVAL < 0);
543
544
545
546
547 TEST_EXPECT_CONDITION(mkdir("/mnt2", S_IRWXALL), RETVAL == 0);
548 TEST_EXPECT_CONDITION(mkdir("/mnt2/nothing-mounted", S_IRWXALL), RETVAL == 0);
549 TEST_EXPECT_CONDITION(mount(NULL, "mnt2", "virtfs", 0, NULL), RETVAL == 0);
550 TEST_EXPECT_CONDITION(mkdir("/mnt2/mountpoint-1", S_IRWXALL), RETVAL == 0);
551 TEST_EXPECT_CONDITION(mount(NULL, "mnt2", "virtfs", 0, NULL), RETVAL == 0);
552 TEST_EXPECT_CONDITION(mkdir("/mnt2/mountpoint-2", S_IRWXALL), RETVAL == 0);
553 ls("/", 1, 1);
554 TEST_EXPECT_CONDITION(umount("mnt2"), RETVAL == 0);
555 ls("/", 1, 1);
556 TEST_EXPECT_CONDITION(umount("mnt2"), RETVAL == 0);
557 ls("/", 1, 1);
558 TEST_EXPECT_CONDITION(umount("mnt2"), RETVAL < 0);
559
560
561
562
563
564 TEST_EXPECT_CONDITION(fd = open("toto8.txt", O_RDWR | O_CREAT,
565 S_IRUSR | S_IWUSR),
566 RETVAL == 23);
567 ls("/", 1, 1);
568 TEST_EXPECT_CONDITION(unlink("toto8.txt"), RETVAL == 0);
569 ls("/", 1, 1);
570
571 strzcpy(buff, "Garbage garbage garbage", 256);
572 TEST_EXPECT_CONDITION(len = read(fd, buff, 256), RETVAL == 0);
573
574 TEST_EXPECT_CONDITION(lseek(fd, 0, SEEK_SET), RETVAL == 0);
575
576 strzcpy(buff, "Hello world from toto8", 256);
577 TEST_EXPECT_CONDITION(len = write(fd, buff, 24), RETVAL == 24);
578
579 TEST_EXPECT_CONDITION(lseek(fd, 0, SEEK_SET), RETVAL == 0);
580
581 strzcpy(buff, "Garbage garbage garbage", 256);
582 TEST_EXPECT_CONDITION(len = read(fd, buff, 256), RETVAL == 24);
583 bochs_printf("read s='%s'\n", buff);
584
585
586
587
588 TEST_EXPECT_CONDITION(mkdir("plotch", S_IRWXALL), RETVAL == 0);
589 TEST_EXPECT_CONDITION(chdir("plotch"), RETVAL == 0);
590 TEST_EXPECT_CONDITION(rmdir("../plotch"), RETVAL < 0);
591 TEST_EXPECT_CONDITION(chdir(".."), RETVAL == 0);
592 TEST_EXPECT_CONDITION(rmdir("plotch"), RETVAL == 0);
593 ls("/", 1, 1);
594
595 TEST_EXPECT_CONDITION(mkdir("plotch", S_IRWXALL), RETVAL == 0);
596 TEST_EXPECT_CONDITION(creat("plotch/a", S_IRWXALL), RETVAL == 0);
597 TEST_EXPECT_CONDITION(rmdir("plotch"), RETVAL < 0);
598 TEST_EXPECT_CONDITION(unlink("plotch/a"), RETVAL == 0);
599 TEST_EXPECT_CONDITION(rmdir("plotch"), RETVAL == 0);
600 ls("/", 1, 1);
601
602 TEST_EXPECT_CONDITION(mkdir("plotch", S_IRWXALL), RETVAL == 0);
603 TEST_EXPECT_CONDITION(fd = open("plotch/a", O_RDWR | O_CREAT, S_IRWXALL),
604 RETVAL == 24);
605 TEST_EXPECT_CONDITION(rmdir("plotch"), RETVAL < 0);
606 TEST_EXPECT_CONDITION(unlink("plotch/a"), RETVAL == 0);
607 TEST_EXPECT_CONDITION(rmdir("plotch"), RETVAL == 0);
608 TEST_EXPECT_CONDITION(close(fd), RETVAL == 0);
609 ls("/", 1, 1);
610
611 TEST_EXPECT_CONDITION(mkdir("this is ", S_IRWXALL), RETVAL == 0);
612 TEST_EXPECT_CONDITION(mkdir("this is / a long path", S_IRWXALL), RETVAL == 0);
613 TEST_EXPECT_CONDITION(mkdir("this is / a long path/tothe", S_IRWXALL), RETVAL == 0);
614 TEST_EXPECT_CONDITION(mkdir("this is / a long path/tothe/destination ", S_IRWXALL), RETVAL == 0);
615 TEST_EXPECT_CONDITION(mkdir("this is / a long path/tothe/destination / directory", S_IRWXALL), RETVAL == 0);
616 TEST_EXPECT_CONDITION(fd = open("this is / a long path/tothe/destination / directory/a", O_RDWR | O_CREAT, S_IRWXALL),
617 RETVAL == 24);
618 TEST_EXPECT_CONDITION(rmdir("this is / a long path/tothe/destination / directory"), RETVAL < 0);
619 TEST_EXPECT_CONDITION(unlink("this is / a long path/tothe/destination / directory/a"), RETVAL == 0);
620 TEST_EXPECT_CONDITION(rmdir("this is / a long path/tothe/destination / directory"), RETVAL == 0);
621 TEST_EXPECT_CONDITION(rmdir("this is / a long path/tothe/destination / directory/"), RETVAL < 0);
622 TEST_EXPECT_CONDITION(rmdir("this is / a long path/tothe/destination "), RETVAL == 0);
623 TEST_EXPECT_CONDITION(rmdir("this is / a long path/tothe/"), RETVAL == 0);
624 TEST_EXPECT_CONDITION(rmdir("this is / a long path"), RETVAL == 0);
625 TEST_EXPECT_CONDITION(rmdir("this is "), RETVAL == 0);
626 TEST_EXPECT_CONDITION(close(fd), RETVAL == 0);
627 ls("/", 1, 1);
628
629
630
631
632
633 TEST_EXPECT_CONDITION(fd = open("toto8.txt", O_RDWR | O_CREAT,
634 S_IRUSR | S_IWUSR),
635 RETVAL == 24);
636 ls("/", 1, 1);
637 TEST_EXPECT_CONDITION(link("toto8.txt", "toto9.txt"), RETVAL == 0);
638 TEST_EXPECT_CONDITION(unlink("toto8.txt"), RETVAL == 0);
639 ls("/", 1, 1);
640
641 strzcpy(buff, "Garbage garbage garbage", 256);
642 TEST_EXPECT_CONDITION(len = read(fd, buff, 256), RETVAL == 0);
643
644 TEST_EXPECT_CONDITION(lseek(fd, 0, SEEK_SET), RETVAL == 0);
645
646 strzcpy(buff, "Hello world from toto8", 256);
647 TEST_EXPECT_CONDITION(len = write(fd, buff, 24), RETVAL == 24);
648
649 TEST_EXPECT_CONDITION(lseek(fd, 0, SEEK_SET), RETVAL == 0);
650
651 strzcpy(buff, "Garbage garbage garbage", 256);
652 TEST_EXPECT_CONDITION(len = read(fd, buff, 256), RETVAL == 24);
653 bochs_printf("read s='%s'\n", buff);
654
655 TEST_EXPECT_CONDITION(fd = open("toto8.txt", O_RDWR), RETVAL < 0);
656 TEST_EXPECT_CONDITION(fd = open("toto9.txt", O_RDWR), RETVAL == 25);
657
658 strzcpy(buff, "Garbage garbage garbage", 256);
659 TEST_EXPECT_CONDITION(len = read(fd, buff, 256), RETVAL == 24);
660 bochs_printf("read s='%s'\n", buff);
661 TEST_EXPECT_CONDITION(unlink("toto9.txt"), RETVAL == 0);
662 ls("/", 1, 1);
663
664
665
666
667
668 TEST_EXPECT_CONDITION(fd = open("toto8.txt", O_RDWR | O_CREAT,
669 S_IRUSR | S_IWUSR),
670 RETVAL == 26);
671 ls("/", 1, 1);
672 TEST_EXPECT_CONDITION(rename("toto8.txt", "toto9.txt"), RETVAL == 0);
673 ls("/", 1, 1);
674
675 strzcpy(buff, "Garbage garbage garbage", 256);
676 TEST_EXPECT_CONDITION(len = read(fd, buff, 256), RETVAL == 0);
677
678 TEST_EXPECT_CONDITION(lseek(fd, 0, SEEK_SET), RETVAL == 0);
679
680 strzcpy(buff, "Hello world from toto8", 256);
681 TEST_EXPECT_CONDITION(len = write(fd, buff, 24), RETVAL == 24);
682
683 TEST_EXPECT_CONDITION(lseek(fd, 0, SEEK_SET), RETVAL == 0);
684
685 strzcpy(buff, "Garbage garbage garbage", 256);
686 TEST_EXPECT_CONDITION(len = read(fd, buff, 256), RETVAL == 24);
687 bochs_printf("read s='%s'\n", buff);
688 TEST_EXPECT_CONDITION(close(fd), RETVAL == 0);
689
690 TEST_EXPECT_CONDITION(fd = open("toto8.txt", O_RDWR), RETVAL < 0);
691 TEST_EXPECT_CONDITION(fd = open("toto9.txt", O_RDWR), RETVAL == 26);
692
693 strzcpy(buff, "Garbage garbage garbage", 256);
694 TEST_EXPECT_CONDITION(len = read(fd, buff, 256), RETVAL == 24);
695 bochs_printf("read s='%s'\n", buff);
696 TEST_EXPECT_CONDITION(unlink("toto9.txt"), RETVAL == 0);
697 TEST_EXPECT_CONDITION(close(fd), RETVAL == 0);
698
699
700 ls("/", 1, 1);
701 TEST_EXPECT_CONDITION(rename("/mnt/subdir0", "subdir42"), RETVAL == 0);
702 ls("/", 1, 1);
703 TEST_EXPECT_CONDITION(rename("titi1.txt", "subdir42"), RETVAL < 0);
704 ls("/", 1, 1);
705 TEST_EXPECT_CONDITION(rename("titi1.txt", "subdir42/titi.txt"), RETVAL == 0);
706
707
708 TEST_EXPECT_CONDITION(chdir("subdir42"), RETVAL == 0);
709 ls(".", 1, 1);
710 ls("..", 1, 1);
711 ls("/", 1, 1);
712 TEST_EXPECT_CONDITION(rename("../subdir42", "../subdir000"), RETVAL == 0);
713 ls(".", 1, 1);
714 ls("/", 1, 1);
715 ls("..", 1, 1);
716
717
718
719
720
721
722 TEST_EXPECT_CONDITION(fd = open("mmap.txt", O_RDWR | O_CREAT,
723 S_IRUSR | S_IWUSR),
724 RETVAL == 26);
725 if (fork() == 0)
726 {
727 char *shrd;
728 TEST_EXPECT_CONDITION(shrd = mmap(NULL, 4096, PROT_READ | PROT_WRITE,
729 MAP_SHARED, fd, 4096),
730 shrd != NULL);
731 nanosleep(1, 0);
732 strzcpy(shrd, "Hello1 from the child (shared mapping) !", 4096);
733 return 0;
734 }
735 else
736 {
737 char *shrd;
738 TEST_EXPECT_CONDITION(shrd = mmap(NULL, 4096, PROT_READ | PROT_WRITE,
739 MAP_SHARED, fd, 4096),
740 shrd != NULL);
741 strzcpy(shrd, "Garbage garbage garbage", 256);
742 nanosleep(2, 0);
743 bochs_printf("Father woken up\n");
744 bochs_printf("Read string from child: '%s'\n", shrd);
745 TEST_EXPECT_CONDITION(strcmp(shrd, "Hello1 from the child (shared mapping) !"),
746 RETVAL == 0);
747 munmap(shrd, 8192);
748 }
749 ls("/", 1, 1);
750 TEST_EXPECT_CONDITION(unlink("mmap.txt"), RETVAL == 0);
751 ls("/", 1, 1);
752
753
754 TEST_EXPECT_CONDITION(fd = open("mmap.txt", O_RDWR | O_CREAT,
755 S_IRUSR | S_IWUSR),
756 RETVAL == 27);
757 TEST_EXPECT_CONDITION(unlink("mmap.txt"), RETVAL == 0);
758 if (fork() == 0)
759 {
760 char *shrd;
761 TEST_EXPECT_CONDITION(shrd = mmap(NULL, 4096, PROT_READ | PROT_WRITE,
762 MAP_SHARED, fd, 4096),
763 shrd != NULL);
764 nanosleep(1, 0);
765 strzcpy(shrd, "Hello2 from the child (shared mapping) !", 4096);
766 return 0;
767 }
768 else
769 {
770 char *shrd;
771 TEST_EXPECT_CONDITION(shrd = mmap(NULL, 4096, PROT_READ | PROT_WRITE,
772 MAP_SHARED, fd, 4096),
773 shrd != NULL);
774 strzcpy(shrd, "Garbage garbage garbage", 256);
775 nanosleep(2, 0);
776 bochs_printf("Father woken up\n");
777 bochs_printf("Read string from child: '%s'\n", shrd);
778 TEST_EXPECT_CONDITION(strcmp(shrd, "Hello2 from the child (shared mapping) !"),
779 RETVAL == 0);
780 }
781 ls("/", 1, 1);
782
783
784 TEST_EXPECT_CONDITION(creat("mmap.txt", S_IRWXALL), RETVAL == 0);
785 if (fork() == 0)
786 {
787 char *shrd;
788 TEST_EXPECT_CONDITION(fd = open("mmap.txt", O_RDWR | O_CREAT,
789 S_IRUSR | S_IWUSR),
790 RETVAL == 28);
791 TEST_EXPECT_CONDITION(shrd = mmap(NULL, 4096, PROT_READ | PROT_WRITE,
792 MAP_SHARED, fd, 4096),
793 shrd != NULL);
794 nanosleep(1, 0);
795 strzcpy(shrd, "Hello3 from the child (shared mapping) !", 4096);
796 return 0;
797 }
798 else
799 {
800 char *shrd;
801 TEST_EXPECT_CONDITION(fd = open("mmap.txt", O_RDWR | O_CREAT,
802 S_IRUSR | S_IWUSR),
803 RETVAL == 28);
804 TEST_EXPECT_CONDITION(shrd = mmap(NULL, 4096, PROT_READ | PROT_WRITE,
805 MAP_SHARED, fd, 4096),
806 shrd != NULL);
807 strzcpy(shrd, "Garbage garbage garbage", 256);
808 nanosleep(2, 0);
809 bochs_printf("Father woken up\n");
810 bochs_printf("Read string from child: '%s'\n", shrd);
811 TEST_EXPECT_CONDITION(strcmp(shrd, "Hello3 from the child (shared mapping) !"),
812 RETVAL == 0);
813 }
814 ls("/", 1, 1);
815
816 bochs_printf("Bye from fstest\n");
817 ls("/", 1, 1);
818 return 0;
819 }