agendafs

A filesystem for your calendar.

git clone git://mccd.space/agendafs
commit 61b12603b64daed3a98eba7af8916189e43ffcef
parent 2354878eacdd8c4a782666fc15140454edeb1e57
Author: Marc Coquand <marc@coquand.email>
Date:   Mon, 28 Jul 2025 14:01:30 +0200

Calculate directory filesize

Implements: https://todo.sr.ht/~marcc/agendafs/18

Diffstat:
Mfuse_node.c | 25+++++++++++++++++++++++--
Mical_extra.c | 2+-
Mical_extra.h | 2+-
3 files changed, 25 insertions(+), 4 deletions(-)
diff --git a/fuse_node.c b/fuse_node.c
@@ -507,6 +507,23 @@ set_node_class(memory_region *mreg, const struct tree_node *node,
 	return write_ical_file(mreg, node, component);
 }
 
+size_t
+calculate_node_size(memory_region *mreg, const struct tree_node *node,
+		    icalcomponent *node_component)
+{
+	if (!node_is_directory(mreg, node, node_component)) {
+		return icalcomponent_get_description_size(node_component);
+	}
+
+	size_t total_size = 0;
+	for (int i; i < node->child_count; i++) {
+		icalcomponent *cic =
+		    get_icalcomponent_from_node(mreg, node->children[i]);
+		total_size += calculate_node_size(mreg, node->children[i], cic);
+	}
+	return total_size;
+}
+
 struct stat
 get_node_stat(memory_region *mreg, const struct tree_node *node,
 	      icalcomponent *node_component)
@@ -523,13 +540,17 @@ get_node_stat(memory_region *mreg, const struct tree_node *node,
 		const char *vdir_path = get_vdir_filepath(mreg, node);
 		int res = stat(vdir_path, &vdir_stat);
 		assert(res == 0);
-		vdir_stat.st_size =
-		    (off_t)get_entry_content_size(node_component);
 		if (node_is_directory(mreg, node, node_component)) {
+			vdir_stat.st_size = (off_t)calculate_node_size(
+			    mreg, node, node_component);
 			vdir_stat.st_mode = S_IFDIR | 0444;
 			vdir_stat.st_nlink = 2;
 		}
 		else {
+			vdir_stat.st_size =
+			    (off_t)icalcomponent_get_description_size(
+				node_component);
+
 			vdir_stat.st_mode = S_IFREG | 0774;
 			vdir_stat.st_nlink = 1;
 		}
diff --git a/ical_extra.c b/ical_extra.c
@@ -118,7 +118,7 @@ get_ical_now()
 }
 
 size_t
-get_entry_content_size(icalcomponent *component)
+icalcomponent_get_description_size(icalcomponent *component)
 {
 	const char *description = icalcomponent_get_description(component);
 	if (!description) {
diff --git a/ical_extra.h b/ical_extra.h
@@ -20,7 +20,7 @@ icaltimetype
 get_ical_now();
 
 size_t
-get_entry_content_size(icalcomponent *component);
+icalcomponent_get_description_size(icalcomponent *component);
 
 char *
 create_new_unique_ics_uid(memory_region *mreg);