agendafs

A filesystem for your calendar.

git clone git://mccd.space/agendafs
commit d9d7036265971f7e2231ebb82c2ba0e1ea47daf8
parent 3a3d9770d3cdf542c3956b3468a3b3db4eda7491
Author: Marc Coquand <marc@coquand.email>
Date:   Tue,  1 Jul 2025 11:36:59 +0100

Change so options are parsed in fuse

Diffstat:
MREADME.md | 6++----
Mjournal_entry.c | 12+-----------
Mjournal_entry.h | 2+-
Mmain.c | 71++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
4 files changed, 72 insertions(+), 19 deletions(-)
diff --git a/README.md b/README.md
@@ -8,12 +8,10 @@ To use it, setup vdirsyncer, locate the ical directory where you want to store
 your notes:
 
 ```
-$ export CALDAVFS_ICS_DIR='~/.journals/the-journal'
-$ mount_agendafs /tmp/local-journal
+$ mount_agendafs -o icsdir=/home/me/.calendars/my-calendar /mnt/local-journal
 ```
 
-Now your `.ics` files are available as plain-text files in `/tmp/local-journal`.
-
+Now your `.ics` files are available as plain-text files in `/mnt/local-journal`.
 See also the notes on VJOURNAL support in calendars below.
 
 ## Motivation
diff --git a/journal_entry.c b/journal_entry.c
@@ -759,18 +759,8 @@ write_entry_to_ical_file(const struct journal_entry *entry)
 	return 0;
 }
 size_t
-load_agendafs_environment()
+load_agendafs_environment(char *ics_dir_env)
 {
-	char *ics_dir_env = getenv("CALDAVFS_ICS_DIR");
-
-	if (ics_dir_env == NULL) {
-		fprintf(
-		    stderr,
-		    "Must set CALDAVFS_ICS_DIR to the absolute path of your "
-		    "calendar. See README.\n");
-		return -1;
-	}
-
 	wordexp_t expanded;
 	if (wordexp(ics_dir_env, &expanded, 0) != 0 || expanded.we_wordc == 0) {
 		fprintf(stderr, "Failed to expand CALDAVFS_ICS_DIR\n");
diff --git a/journal_entry.h b/journal_entry.h
@@ -140,7 +140,7 @@ int
 build_notes_hashmap();
 
 size_t
-load_agendafs_environment();
+load_agendafs_environment(char *dir);
 char *
 create_new_unique_ics_uid();
 
diff --git a/main.c b/main.c
@@ -11,6 +11,7 @@
 #include <pthread.h>
 #include <regex.h>
 #include <stdbool.h>
+#include <stddef.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -424,6 +425,53 @@ struct fuse_operations journal_oper = {.getattr = journal_getattr,
 				       .readlink = journal_readlink,
 				       .rename = journal_rename};
 
+struct agendafs_config {
+	char *ics_directory;
+};
+enum {
+	KEY_HELP,
+	KEY_VERSION,
+};
+
+#define CUSTOMFS_OPT(t, p, v) {t, offsetof(struct agendafs_config, p), v}
+
+static struct fuse_opt agendafs_opts[] = {
+    CUSTOMFS_OPT("icsdir=%s", ics_directory, 0),
+
+    FUSE_OPT_KEY("-V", KEY_VERSION),
+    FUSE_OPT_KEY("--version", KEY_VERSION),
+    FUSE_OPT_KEY("-h", KEY_HELP),
+    FUSE_OPT_KEY("--help", KEY_HELP),
+    FUSE_OPT_END};
+
+static int
+agendafs_opt_proc(void *data, const char *arg, int key,
+		  struct fuse_args *outargs)
+{
+	switch (key) {
+	case KEY_HELP:
+		LOG("Is KEY_HELP");
+		fprintf(stderr,
+			"usage: %s mountpoint [options]\n"
+			"\n"
+			"agendafs options:\n"
+			"    -o icsdir=STRING\n",
+			outargs->argv[0]);
+		fuse_opt_add_arg(outargs, "-h");
+		fuse_main(outargs->argc, outargs->argv, &journal_oper, NULL);
+		exit(1);
+
+	case KEY_VERSION:
+
+		LOG("Is KEY_VERSION");
+		fprintf(stderr, "agendafs version %s\n", "v0.01 ALPHA");
+		fuse_opt_add_arg(outargs, "--version");
+		fuse_main(outargs->argc, outargs->argv, &journal_oper, NULL);
+		exit(0);
+	}
+	return 1;
+}
+
 int
 main(int argc, char *argv[])
 {
@@ -431,9 +479,25 @@ main(int argc, char *argv[])
 
 	tzset();
 
-	fuse_tree_root = create_tree_node(NULL, NULL);
+	struct fuse_args args = FUSE_ARGS_INIT(argc, argv);
+	struct agendafs_config conf;
+	memset(&conf, 0, sizeof(conf));
+
+	fuse_opt_parse(&args, &conf, agendafs_opts, agendafs_opt_proc);
+
+	if (conf.ics_directory == NULL) {
+		fprintf(stderr,
+			"usage: %s mountpoint [options]\n"
+			"\n"
+			"agendafs options:\n"
+			"    -o icsdir=STRING\n",
+			argv[0]);
+		fuse_opt_add_arg(&args, "-h");
+		fuse_main(args.argc, args.argv, &journal_oper, NULL);
+		exit(1);
+	}
 
-	if (load_agendafs_environment() != 0) {
+	if (load_agendafs_environment(conf.ics_directory) != 0) {
 		fprintf(stderr, "Failed to load ICS directory\n");
 		exit(1);
 	}
@@ -443,8 +507,9 @@ main(int argc, char *argv[])
 		return 1;
 	}
 
+	fuse_tree_root = create_tree_node(NULL, NULL);
 	load_journal_entries();
-	int ret = fuse_main(argc, argv, &journal_oper, NULL);
+	int ret = fuse_main(args.argc, args.argv, &journal_oper, NULL);
 	LOG("Cleaning up");
 
 	pthread_cancel(watcher_thread);	    // Stop the watcher when FUSE ends