summaryrefslogtreecommitdiff
path: root/libmailutils/base/registrar.c
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2019-03-26 21:12:03 +0200
committerSergey Poznyakoff <gray@gnu.org>2019-03-26 21:12:03 +0200
commit5b69ce81ec29afeea0e67bd8b0f0b193a7b0c022 (patch)
tree8e4579dde855742117781426ea92ab08bf0b6432 /libmailutils/base/registrar.c
parent7a1b9263d79005cd66ed7ebdd8b8e2842e7cd6b3 (diff)
downloadmailutils-5b69ce81ec29afeea0e67bd8b0f0b193a7b0c022.tar.gz
mailutils-5b69ce81ec29afeea0e67bd8b0f0b193a7b0c022.tar.bz2
Implement selection of requested mailbox formats in scanning the local file system folders.
* include/mailutils/registrar.h (mu_record_match): New struct. (mu_registrar_match_records): New proto. * libmailutils/base/registrar.c (mu_registrar_match_records): New function. * libmailutils/mailbox/fsfolder.c (list_helper): Actually select the matching record from scn->records (if supplied). * libmailutils/tests/Makefile.am: Add new tests. * libmailutils/tests/fsfolder.c: Minor changes. * libmailutils/tests/testsuite.at: Add new tests. * libmailutils/tests/fsfolder03.at: New file. * libmailutils/tests/fsfolder04.at: New file.
Diffstat (limited to 'libmailutils/base/registrar.c')
-rw-r--r--libmailutils/base/registrar.c63
1 files changed, 63 insertions, 0 deletions
diff --git a/libmailutils/base/registrar.c b/libmailutils/base/registrar.c
index e25e6d810..debac377d 100644
--- a/libmailutils/base/registrar.c
+++ b/libmailutils/base/registrar.c
@@ -446,3 +446,66 @@ mu_registrar_apply_filter (int (*flt) (mu_record_t, void *), void *data)
mu_monitor_unlock (&registrar_monitor);
return 0;
}
+
+struct match_closure
+{
+ mu_url_t url;
+ int flags;
+ int err;
+};
+
+static int
+select_match (void **itmv, size_t itmc, void *call_data)
+{
+ struct match_closure *mc = call_data;
+ int rc = mu_record_is_scheme (itmv[0], mc->url, mc->flags);
+ if (rc)
+ {
+ struct mu_record_match *match = malloc (sizeof (*match));
+ if (!match)
+ {
+ mc->err = errno;
+ return MU_LIST_MAP_STOP;
+ }
+ match->record = itmv[0];
+ match->flags = rc;
+ itmv[0] = match;
+ return MU_LIST_MAP_OK;
+ }
+ return MU_LIST_MAP_SKIP;
+}
+
+/* Select records matching pathname NAME with given FLAGS
+ (MU_FOLDER_ATTRIBUTE_* bitmask). On success, store each
+ match as a pointer to struct mu_record_match in *RET.
+*/
+int
+mu_registrar_match_records (char const *name, int flags, mu_list_t *ret)
+{
+ int rc;
+ struct match_closure mc;
+ mu_list_t lst;
+
+ rc = mu_url_create (&mc.url, name);
+ if (rc)
+ return rc;
+ mc.flags = flags;
+ mc.err = 0;
+
+ mu_monitor_wrlock (&registrar_monitor);
+ rc = mu_list_map (registrar_list, select_match, &mc, 1, &lst);
+ mu_monitor_unlock (&registrar_monitor);
+ mu_url_destroy (&mc.url);
+ if (rc == 0)
+ {
+ mu_list_set_destroy_item (lst, mu_list_free_item);
+ if (mc.err)
+ {
+ mu_list_destroy (&lst);
+ rc = mc.err;
+ }
+ }
+ if (rc == 0)
+ *ret = lst;
+ return rc;
+}

Return to:

Send suggestions and report system problems to the System administrator.