7 dir_init (struct dir *d, size_t entry_cnt)
9 d->entry_cnt = entry_cnt;
10 d->entries = calloc (1, sizeof *d->entries * entry_cnt);
11 return d->entries != NULL;
15 dir_destroy (struct dir *d)
21 dir_size (struct dir *d)
23 return d->entry_cnt * sizeof *d->entries;
27 dir_read (struct dir *d, struct file *file)
29 file_read_at (file, d->entries, dir_size (d), 0);
33 dir_write (struct dir *d, struct file *file)
35 file_write_at (file, d->entries, dir_size (d), 0);
38 static struct dir_entry *
39 lookup (const struct dir *d, const char *name)
44 ASSERT (name != NULL);
46 if (strlen (name) > FILENAME_LEN_MAX)
49 for (i = 0; i < d->entry_cnt; i++)
51 struct dir_entry *e = &d->entries[i];
52 if (e->in_use && !strcmp (name, e->name))
59 dir_lookup (const struct dir *d, const char *name,
60 disk_sector_no *filehdr_sector)
62 const struct dir_entry *e;
65 ASSERT (name != NULL);
70 if (filehdr_sector != NULL)
71 *filehdr_sector = e->filehdr_sector;
79 dir_add (struct dir *d, const char *name, disk_sector_no filehdr_sector)
84 ASSERT (name != NULL);
85 ASSERT (lookup (d, name) == NULL);
87 for (i = 0; i < d->entry_cnt; i++)
89 struct dir_entry *e = &d->entries[i];
93 strlcpy (e->name, name, sizeof e->name);
94 e->filehdr_sector = filehdr_sector;
102 dir_remove (struct dir *d, const char *name)
107 ASSERT (name != NULL);
109 e = lookup (d, name);
119 void dir_list (const struct dir *);
120 void dir_print (const struct dir *);