aboutsummaryrefslogtreecommitdiff
path: root/c_implementation/src/akfs_defuse.c
diff options
context:
space:
mode:
authorkaotisk <kaotisk@arching-kaos.org>2025-04-24 01:59:36 +0300
committerkaotisk <kaotisk@arching-kaos.org>2025-04-24 01:59:36 +0300
commit22d9aeb0f3057c43cf7c561bc208c3acec45135e (patch)
tree2e0eca7350a778a0e9c1011b41eea18429a742b4 /c_implementation/src/akfs_defuse.c
parent07d2b7e430e17cceaab2715a816e4182f299f441 (diff)
downloadarching-kaos-tools-22d9aeb0f3057c43cf7c561bc208c3acec45135e.tar.gz
arching-kaos-tools-22d9aeb0f3057c43cf7c561bc208c3acec45135e.tar.bz2
arching-kaos-tools-22d9aeb0f3057c43cf7c561bc208c3acec45135e.zip
[libakfs] Updates
Diffstat (limited to 'c_implementation/src/akfs_defuse.c')
-rw-r--r--c_implementation/src/akfs_defuse.c97
1 files changed, 97 insertions, 0 deletions
diff --git a/c_implementation/src/akfs_defuse.c b/c_implementation/src/akfs_defuse.c
new file mode 100644
index 0000000..da0c3d0
--- /dev/null
+++ b/c_implementation/src/akfs_defuse.c
@@ -0,0 +1,97 @@
+#define FUSE_USE_VERSION 31
+#include <fuse3/fuse.h>
+#include <libakfs.h>
+#include <libaklog.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+// Called when a file is read
+static int akfs_fuse_read(const char *path, char *buf, size_t size, off_t offset,
+ struct fuse_file_info *fi)
+{
+ (void) fi; // Unused
+ const char *content = "Hello, World!\n";
+ size_t len = strlen(content);
+
+ if (strcmp(path, "/hello") != 0) // Only support "/hello"
+ return -ENOENT;
+
+ if (offset < 0 || (size_t)offset >= len)
+ return 0;
+
+ size = (size < len - offset) ? size : len - offset;
+ memcpy(buf, content + offset, size);
+ return size;
+}
+
+// Called to list files in the root directory
+static int akfs_fuse_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
+ off_t offset, struct fuse_file_info *fi,
+ enum fuse_readdir_flags flags)
+{
+ (void) offset; (void) fi; (void) flags; // Unused
+
+ if (strcmp(path, "/") != 0) // Only support root dir
+ return -ENOENT;
+
+ filler(buf, ".", NULL, 0, 0); // Current dir
+ filler(buf, "..", NULL, 0, 0); // Parent dir
+ filler(buf, "hello", NULL, 0, 0); // Our file
+ size_t ms_len = 100;
+ size_t ma_len = 100;
+ akfs_map_v3 map_store[ms_len];
+ akfs_map_v3* mps_ptr = &map_store[0];
+ void* mps_start = &map_store[0];
+ (void)mps_start;
+ sha512sum maps_avail[ma_len];
+ sha512sum *mav_ptr = &maps_avail[0];
+ void* mav_start = &map_store[0];
+ (void)mav_start;
+ ak_fs_map_v3_init_store(&mps_ptr, ms_len);
+ ak_fs_sha512sum_init_avail(&mav_ptr, ma_len);
+ ak_fs_get_available_maps_from_fs(&mav_ptr, ma_len);
+ ak_fs_load_available_maps(&mav_ptr, ma_len, &mps_ptr, ms_len);
+ akfs_map_v3 *ptr = NULL;
+ for (ptr = mps_ptr; ptr < mps_ptr + ms_len; ++ptr)
+ {
+ if ( !ak_fs_map_v3_is_null(ptr) ) ak_fs_map_v3_print_filename(ptr);
+ filler(buf, ak_fs_map_v3_get_filename(ptr), NULL, 0, 0);
+ }
+ return 0;
+}
+
+// Called to get file attributes (metadata)
+static int akfs_fuse_getattr(const char *path, struct stat *st, struct fuse_file_info *fi)
+{
+ (void) fi; // Unused
+ st->st_uid = getuid();
+ st->st_gid = getgid();
+ st->st_atime = st->st_mtime = time(NULL);
+
+ if (strcmp(path, "/") == 0) {
+ st->st_mode = S_IFDIR | 0755; // Directory
+ st->st_nlink = 2;
+ } else if (strcmp(path, "/hello") == 0) {
+ st->st_mode = S_IFREG | 0644; // Regular file
+ st->st_nlink = 1;
+ st->st_size = strlen("Hello, World!\n");
+ } else {
+ return -ENOENT; // Not found
+ }
+ return 0;
+}
+
+// FUSE operations struct (only implementing needed functions)
+static struct fuse_operations akfs_fuse_ops = {
+ .getattr = akfs_fuse_getattr,
+ .readdir = akfs_fuse_readdir,
+ .read = akfs_fuse_read,
+};
+
+int main(int argc, char *argv[])
+{
+ return fuse_main(argc, argv, &akfs_fuse_ops, NULL);
+}