agendafs
A filesystem for your calendar.
git clone git://mccd.space/agendafscommit 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:
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);