SimpleOS

LXR

Navigation



Site hébergé par : enix

The LXR Cross Referencer for SOS

source navigation ]
diff markup ]
identifier search ]
general search ]
 
 
Article:1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 6.5 ] [ 7 ] [ 7.5 ] [ 8 ] [ 9 ] [ 9.5 ]

001 /* Copyright (C) 2005 David Decotigny
002 
003    This program is free software; you can redistribute it and/or
004    modify it under the terms of the GNU General Public License
005    as published by the Free Software Foundation; either version 2
006    of the License, or (at your option) any later version.
007    
008    This program is distributed in the hope that it will be useful,
009    but WITHOUT ANY WARRANTY; without even the implied warranty of
010    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
011    GNU General Public License for more details.
012    
013    You should have received a copy of the GNU General Public License
014    along with this program; if not, write to the Free Software
015    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
016    USA. 
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  * @file fstest.c
029  *
030  * File-system tests
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   /* O_EXCL with an already-existing file */
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   /* O_EXCL with an already-existing file */
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   /* Trailing slash on non-dir entries */
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   /* Substring match */
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   /* Substring match */
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    * read/write/seek
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    * truncate
200    */
201 
202   TEST_EXPECT_CONDITION(ftruncate(fd, 3), RETVAL == 0);
203   
204   /* The current position should not have changed */
205   TEST_EXPECT_CONDITION(lseek(fd, 0, SEEK_CUR), RETVAL == 10);
206 
207   /* Make sure we cannot read anything because we get past the end of
208      the file */
209   strzcpy(buff, "Garbage garbage garbage", 256);
210   TEST_EXPECT_CONDITION(len = read(fd, buff, 256), RETVAL == 0);
211 
212   /* Now get back at the begining of the file */
213   TEST_EXPECT_CONDITION(lseek(fd, 0, SEEK_SET), RETVAL == 0);
214 
215   /* Make sure that we can read something with the correct first 3
216      characters */
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    * open mode
224    */
225 
226   ls("/", 1, 1);
227 
228 
229   /* Open r/w, create read-only */
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); /* Permission denied ! */
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   /* Open read-only, create r/w */
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); /* Permission denied ! */
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   /* Create another process that chdirs in it */
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    * ioctl / fcntl
300    */
301 
302   TEST_EXPECT_CONDITION(fcntl(fd, 2, 3), RETVAL < 0); /* Not supported
303                                                          by virtfs */
304 
305   ls("/", 1, 1);
306 
307   /*
308    * creat/link/unlink/symlink
309    */
310   TEST_EXPECT_CONDITION(creat("toto4.txt", S_IRUSR), RETVAL == 0);
311   TEST_EXPECT_CONDITION(creat("toto4.txt", S_IRWXALL), RETVAL < 0); /*EEXIST*/
312   TEST_EXPECT_CONDITION(link("toto4.txt", "toto5.txt"), RETVAL == 0);
313   TEST_EXPECT_CONDITION(link("toto4.txt", "toto5.txt"), RETVAL < 0); /*EEXIST*/
314   TEST_EXPECT_CONDITION(link("toto4.txt", "toto.txt"), RETVAL < 0); /*EEXIST*/
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); /*ENOENT*/
342   TEST_EXPECT_CONDITION(unlink("toto4.txt"), RETVAL == 0);
343   TEST_EXPECT_CONDITION(unlink("toto42.txt"), RETVAL < 0); /* ENOENT */
344   TEST_EXPECT_CONDITION(unlink("toto4.txt"), RETVAL < 0); /* ENOENT */
345   TEST_EXPECT_CONDITION(creat("toto4.txt", S_IWUSR | S_IRUSR), RETVAL == 0);
346   TEST_EXPECT_CONDITION(unlink("toto5.txt/"), RETVAL < 0); /* EISDIR ? */
347   TEST_EXPECT_CONDITION(rmdir("toto5.txt/"), RETVAL < 0); /* ENOTDIR ? */
348   TEST_EXPECT_CONDITION(rmdir("toto5.txt"), RETVAL < 0); /* ENOTDIR ? */
349   TEST_EXPECT_CONDITION(unlink("toto5.txt"), RETVAL == 0);
350   TEST_EXPECT_CONDITION(unlink("toto5.txt"), RETVAL < 0); /* ENOENT */
351   TEST_EXPECT_CONDITION(creat("toto4.txt", S_IRWXALL), RETVAL < 0); /*EEXIST*/
352 
353   ls("/", 1, 1);
354 
355   /* Change symlinks */
356   TEST_EXPECT_CONDITION(symlink("toto4.txt", "toto5.txt"), RETVAL == 0);
357   TEST_EXPECT_CONDITION(symlink("toto4.txt", "toto5.txt"), RETVAL < 0); /*EEXIST*/
358   TEST_EXPECT_CONDITION(symlink("toto4.txt", "toto.txt"), RETVAL < 0); /*EEXIST*/
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); /*EEXIST*/
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   /* mkdir/rmdir */
398 
399   TEST_EXPECT_CONDITION(mkdir("yo1", S_IRUSR | S_IXUSR), RETVAL == 0);
400   TEST_EXPECT_CONDITION(mkdir("yo1", S_IRWXALL), RETVAL < 0); /*EEXIST*/
401 
402   ls("/", 1, 1);
403 
404   TEST_EXPECT_CONDITION(unlink("yo1"), RETVAL < 0); /*EISDIR*/
405   TEST_EXPECT_CONDITION(unlink("yo1/"), RETVAL < 0); /*EISDIR*/
406   TEST_EXPECT_CONDITION(rmdir("yo1"), RETVAL == 0);
407   TEST_EXPECT_CONDITION(rmdir("yo1"), RETVAL < 0); /*ENOENT*/
408   TEST_EXPECT_CONDITION(rmdir("yoda"), RETVAL < 0); /*ENOENT*/
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   /* subdirs */
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   /* Test chroot */
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   /* mount */
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   /* Make sure we cannot umount if the FS is in use */
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   /* Make sure we cannot umount if the FS is in use */
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   /* Create another process that chdirs in it */
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    * Mountchain exploration
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    * Erasing files while they are in use
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    * rmdir on still used dirs
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    * Unlink/link files while they are in use
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    * Rename files while they are in use
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   /* Rename */
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   /* Rename a dir being used */
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    * test mmap
719    */
720 
721   /* Common use: shared file suppressed as soon as possible */
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   /* Common use: shared file suppressed as soon as possible */
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   /* Basic use */
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 }

source navigation ] diff markup ] identifier search ] general search ]