aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarvin Borner2022-02-05 00:50:39 +0100
committerMarvin Borner2022-02-05 00:50:39 +0100
commit9a663721cd8dc4bfb5bcea507484cbf98c3ec057 (patch)
tree23111f5d23e1b89d87540b98593a77ca071a2658
parente4b01ac99b3d13c5d1057eacc04757cea957cbd7 (diff)
Directory creation
-rw-r--r--makefile4
-rw-r--r--src/fuse.c77
2 files changed, 57 insertions, 24 deletions
diff --git a/makefile b/makefile
index 857a080..9deaf58 100644
--- a/makefile
+++ b/makefile
@@ -45,13 +45,13 @@ $(MNT):
@mkdir -p $@
mount: disk $(MNT)
- @DEV=$$(losetup -a | grep $(BUILD)/disk.img | grep -m 1 -o '/dev/loop[[:digit:]]*') && \
+ @DEV=$$($(SU) losetup -a | grep $(BUILD)/disk.img | grep -m 1 -o '/dev/loop[[:digit:]]*') && \
PART="p1" && \
($(SU) $(BUILD)/marfs_fuse "$$DEV$$PART" -f $(MNT) -o allow_other &) && \
echo "Mounted $$DEV$$PART"
umount:
- @DEV=$$(losetup -a | grep $(BUILD)/disk.img | grep -m 1 -o '/dev/loop[[:digit:]]*') && \
+ @DEV=$$($(SU) losetup -a | grep $(BUILD)/disk.img | grep -m 1 -o '/dev/loop[[:digit:]]*') && \
$(SU) losetup -d "$$DEV" && \
$(SU) umount $(MNT) && \
echo "Unmounted $$DEV$$PART" || \
diff --git a/src/fuse.c b/src/fuse.c
index 4876f36..def67a4 100644
--- a/src/fuse.c
+++ b/src/fuse.c
@@ -108,6 +108,33 @@ static u8 read_entry_header(const char *path, u32 start, struct marfs_entry_head
return 0;
}
+static int add_dir_entry(struct marfs_entry_header *parent, const char *name, u32 sector)
+{
+ u32 last = parent->id;
+ while (parent->next != MARFS_END)
+ last = parent->next;
+
+ struct marfs_dir_entry dir;
+ read_sector(last, sizeof(dir), &dir);
+
+ assert(dir.info.count + 1 < MARFS_DIR_ENTRY_COUNT); // TODO: Create new dir entry at end
+
+ struct marfs_dir_entry_data data = (struct marfs_dir_entry_data){
+ .length = strlen(name),
+ .pointer = MARFS_POINT(sector, sector),
+ };
+
+ if (data.length > MARFS_NAME_LENGTH)
+ return -EINVAL;
+
+ strcpy(data.name, name);
+ dir.entries[dir.info.count++] = data;
+
+ write_sector(last, sizeof(dir), &dir);
+
+ return 0;
+}
+
/**
* Fuse operations
*/
@@ -282,35 +309,41 @@ static int marfs_create(const char *path, mode_t mode, struct fuse_file_info *fi
if (!(base++))
return -EINVAL;
- u32 last = parent.id;
- while (parent.next != MARFS_END)
- last = parent.next;
+ return add_dir_entry(&parent, base, sector);
+}
- struct marfs_dir_entry dir;
- read_sector(last, sizeof(dir), &dir);
+static int marfs_mkdir(const char *path, mode_t mode)
+{
+ debug("mkdir() on %s", path);
+ UNUSED(mode);
- assert(dir.info.count + 1 < MARFS_DIR_ENTRY_COUNT); // TODO: Create new dir entry at end
+ struct marfs_entry_header parent = { .type = 0 };
+ u8 aah = read_entry_header(path, header.main.head, &parent);
+ if (aah) {
+ debug("%s already exists\n", path);
+ errno = EEXIST;
+ return -1;
+ }
+ if (parent.type != MARFS_DIR_ENTRY) {
+ debug("%s could not get created\n", path);
+ return -1;
+ }
- struct marfs_dir_entry_data data = (struct marfs_dir_entry_data){
- .length = strlen(base),
- .pointer = MARFS_POINT(sector, sector),
+ u32 sector = find_free_sector();
+ struct marfs_dir_entry_info info = {
+ .header.type = MARFS_DIR_ENTRY,
+ .header.id = sector,
+ .header.prev = MARFS_END,
+ .header.next = MARFS_END,
+ .count = 0,
};
+ write_sector(sector, sizeof(info), &info);
- if (data.length > MARFS_NAME_LENGTH)
+ char *base = strrchr(path, '/');
+ if (!(base++))
return -EINVAL;
- strcpy(data.name, base);
- dir.entries[dir.info.count++] = data;
-
- write_sector(last, sizeof(dir), &dir);
-
- return 0;
-}
-
-static int marfs_mkdir(const char *path, mode_t mode)
-{
- debug("mkdir() on %s", path);
- return 0;
+ return add_dir_entry(&parent, base, sector);
}
static int marfs_unlink(const char *path)