9bfd8ba3f028352b65827b5e73339fd338211b78
[pintos-anon] / grading / filesys / dir-rm-tree.c
1 #include <stdarg.h>
2 #include <stdio.h>
3 #include <syscall.h>
4 #include "fslib.h"
5 #include "mk-tree.h"
6
7 const char test_name[] = "dir-rm-tree";
8
9 static void remove_tree (int at, int bt, int ct, int dt);
10
11 void
12 test_main (void) 
13 {
14   make_tree (4, 3, 3, 4);
15   remove_tree (4, 3, 3, 4);
16 }
17
18 static void do_remove (const char *format, ...) PRINTF_FORMAT (1, 2);
19
20 static void
21 remove_tree (int at, int bt, int ct, int dt) 
22 {
23   char try[128];
24   int a, b, c, d;
25
26   msg ("removing /0/0/0/0 through /%d/%d/%d/%d...",
27        at - 1, bt - 1, ct - 1, dt - 1);
28   quiet = true;
29   for (a = 0; a < at; a++) 
30     {
31       for (b = 0; b < bt; b++) 
32         {
33           for (c = 0; c < ct; c++) 
34             {
35               for (d = 0; d < dt; d++)
36                 do_remove ("/%d/%d/%d/%d", a, b, c, d);
37               do_remove ("/%d/%d/%d", a, b, c);
38             }
39           do_remove ("/%d/%d", a, b);
40         }
41       do_remove ("/%d", a);
42     }
43   quiet = false;
44
45   snprintf (try, sizeof (try), "/%d/%d/%d/%d", at - 1, 0, ct - 1, 0);
46   CHECK (open (try) == -1, "open \"%s\" (must return -1)", try);
47 }
48
49 static void
50 do_remove (const char *format, ...) 
51 {
52   char name[128];
53   va_list args;
54
55   va_start (args, format);
56   vsnprintf (name, sizeof name, format, args);
57   va_end (args);
58
59   CHECK (remove (name), "remove \"%s\"", name);
60 }