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