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