Add dir_list(), dir_dump().
[pintos-anon] / src / filesys / directory.c
1 #include "directory.h"
2 #include "file.h"
3 #include "fsutil.h"
4 #include "lib.h"
5 #include "malloc.h"
6
7 bool
8 dir_init (struct dir *d, size_t entry_cnt) 
9 {
10   d->entry_cnt = entry_cnt;
11   d->entries = calloc (1, sizeof *d->entries * entry_cnt);
12   return d->entries != NULL;
13 }
14
15 void
16 dir_destroy (struct dir *d) 
17 {
18   free (d->entries);
19 }
20
21 static off_t
22 dir_size (struct dir *d) 
23 {
24   return d->entry_cnt * sizeof *d->entries;
25 }
26
27 void
28 dir_read (struct dir *d, struct file *file) 
29 {
30   file_read_at (file, d->entries, dir_size (d), 0);
31 }
32
33 void
34 dir_write (struct dir *d, struct file *file) 
35 {
36   file_write_at (file, d->entries, dir_size (d), 0);
37 }
38
39 static struct dir_entry *
40 lookup (const struct dir *d, const char *name) 
41 {
42   size_t i;
43   
44   ASSERT (d != NULL);
45   ASSERT (name != NULL);
46
47   if (strlen (name) > FILENAME_LEN_MAX)
48     return NULL;
49
50   for (i = 0; i < d->entry_cnt; i++) 
51     {
52       struct dir_entry *e = &d->entries[i];
53       if (e->in_use && !strcmp (name, e->name))
54         return e;
55     }
56   return NULL;
57 }
58
59 bool
60 dir_lookup (const struct dir *d, const char *name,
61             disk_sector_no *filehdr_sector) 
62 {
63   const struct dir_entry *e;
64
65   ASSERT (d != NULL);
66   ASSERT (name != NULL);
67   
68   e = lookup (d, name);
69   if (e != NULL) 
70     {
71       if (filehdr_sector != NULL)
72         *filehdr_sector = e->filehdr_sector;
73       return true;
74     }
75   else
76     return false;
77 }
78
79 bool
80 dir_add (struct dir *d, const char *name, disk_sector_no filehdr_sector) 
81 {
82   size_t i;
83   
84   ASSERT (d != NULL);
85   ASSERT (name != NULL);
86   ASSERT (lookup (d, name) == NULL);
87
88   for (i = 0; i < d->entry_cnt; i++)
89     {
90       struct dir_entry *e = &d->entries[i];
91       if (!e->in_use) 
92         {
93           e->in_use = true;
94           strlcpy (e->name, name, sizeof e->name);
95           e->filehdr_sector = filehdr_sector;
96           return true;
97         }
98     }
99   return false;
100 }
101
102 bool
103 dir_remove (struct dir *d, const char *name) 
104 {
105   struct dir_entry *e;
106
107   ASSERT (d != NULL);
108   ASSERT (name != NULL);
109
110   e = lookup (d, name);
111   if (e != NULL) 
112     {
113       e->in_use = false;
114       return true;
115     }
116   else
117     return false;
118 }
119
120 void
121 dir_list (const struct dir *d)
122 {
123   struct dir_entry *e;
124   
125   for (e = d->entries; e < d->entries + d->entry_cnt; e++)
126     if (e->in_use)
127       printk ("%s\n", e->name);
128 }
129
130 void
131 dir_dump (const struct dir *d) 
132 {
133   struct dir_entry *e;
134   
135   for (e = d->entries; e < d->entries + d->entry_cnt; e++)
136     if (e->in_use) 
137       {
138         printk ("Contents of %s:\n", e->name);
139         fsutil_print (e->name);
140         printk ("\n");
141       }
142 }