1#include <fs/fat.h>
2#include <mem/alloc.h>
3#include <stdbool.h>
4#include <stdint.h>
5#include <string.h>
6
7// TODO: errno
8
9bool fat_delete(struct fat_fs *fs, uint32_t dir_cluster, const char *filename) {
10 uint32_t index;
11 struct fat_dirent *dirent = fat_lookup(fs, cluster: dir_cluster, f: filename, out_index: &index);
12 if (!dirent)
13 return false;
14
15 uint32_t start_cluster = fat_get_dir_cluster(d: dirent);
16 ((uint8_t *) dirent->name)[0] = 0xE5;
17
18 if (!fat_write_dirent(fs, dir_cluster, dirent_to_write: dirent, entry_index: index)) {
19 return false;
20 }
21
22 fat_free_chain(fs, start_cluster);
23
24 kfree(dirent);
25
26 return true;
27}
28
29bool fat_rename(struct fat_fs *fs, uint32_t dir_cluster, const char *filename,
30 const char *new_filename) {
31 char fmtname[11] = {0};
32 fat_format_filename_83(name: new_filename, out: fmtname);
33 uint32_t index;
34 struct fat_dirent *dirent = fat_lookup(fs, cluster: dir_cluster, f: filename, out_index: &index);
35
36 if (!dirent)
37 return false;
38
39 if (fat_contains(fs, cluster: dir_cluster, f: new_filename))
40 return false;
41
42 memcpy(dirent->name, fmtname, 11);
43
44 if (!fat_write_dirent(fs, dir_cluster, dirent_to_write: dirent, entry_index: index)) {
45 return false;
46 }
47
48 kfree(dirent);
49
50 return true;
51}
52