8 dir_init (struct dir *d, size_t entry_cnt)
10 d->entry_cnt = entry_cnt;
11 d->entries = calloc (1, sizeof *d->entries * entry_cnt);
12 return d->entries != NULL;
16 dir_destroy (struct dir *d)
22 dir_size (struct dir *d)
24 return d->entry_cnt * sizeof *d->entries;
28 dir_read (struct dir *d, struct file *file)
30 file_read_at (file, d->entries, dir_size (d), 0);
34 dir_write (struct dir *d, struct file *file)
36 file_write_at (file, d->entries, dir_size (d), 0);
39 static struct dir_entry *
40 lookup (const struct dir *d, const char *name)
45 ASSERT (name != NULL);
47 if (strlen (name) > FILENAME_LEN_MAX)
50 for (i = 0; i < d->entry_cnt; i++)
52 struct dir_entry *e = &d->entries[i];
53 if (e->in_use && !strcmp (name, e->name))
60 dir_lookup (const struct dir *d, const char *name,
61 disk_sector_no *filehdr_sector)
63 const struct dir_entry *e;
66 ASSERT (name != NULL);
71 if (filehdr_sector != NULL)
72 *filehdr_sector = e->filehdr_sector;
80 dir_add (struct dir *d, const char *name, disk_sector_no filehdr_sector)
85 ASSERT (name != NULL);
86 ASSERT (lookup (d, name) == NULL);
88 for (i = 0; i < d->entry_cnt; i++)
90 struct dir_entry *e = &d->entries[i];
94 strlcpy (e->name, name, sizeof e->name);
95 e->filehdr_sector = filehdr_sector;
103 dir_remove (struct dir *d, const char *name)
108 ASSERT (name != NULL);
110 e = lookup (d, name);
121 dir_list (const struct dir *d)
125 for (e = d->entries; e < d->entries + d->entry_cnt; e++)
127 printk ("%s\n", e->name);
131 dir_dump (const struct dir *d)
135 for (e = d->entries; e < d->entries + d->entry_cnt; e++)
138 printk ("Contents of %s:\n", e->name);
139 fsutil_print (e->name);